support track selection before playback

This commit is contained in:
Luke Pulverenti
2017-11-05 16:51:23 -05:00
parent b9c1f61681
commit 5cb7469028
41 changed files with 355 additions and 675 deletions

View File

@@ -996,7 +996,7 @@ namespace Emby.Server.Implementations
NotificationManager = new NotificationManager(LogManager, UserManager, ServerConfigurationManager);
RegisterSingleInstance(NotificationManager);
SubtitleManager = new SubtitleManager(LogManager.GetLogger("SubtitleManager"), FileSystemManager, LibraryMonitor, LibraryManager, MediaSourceManager);
SubtitleManager = new SubtitleManager(LogManager.GetLogger("SubtitleManager"), FileSystemManager, LibraryMonitor, LibraryManager, MediaSourceManager, ServerConfigurationManager);
RegisterSingleInstance(SubtitleManager);
RegisterSingleInstance<IDeviceDiscovery>(new DeviceDiscovery(LogManager.GetLogger("IDeviceDiscovery"), ServerConfigurationManager, SocketFactory, TimerFactory));

View File

@@ -296,7 +296,7 @@ namespace Emby.Server.Implementations.Channels
if (requiresCallback != null)
{
results = await GetChannelItemMediaSourcesInternal(requiresCallback, GetItemExternalId(item), cancellationToken)
results = await GetChannelItemMediaSourcesInternal(requiresCallback, item.ExternalId, cancellationToken)
.ConfigureAwait(false);
}
else
@@ -990,18 +990,6 @@ namespace Emby.Server.Implementations.Channels
return result;
}
private string GetItemExternalId(BaseItem item)
{
var externalId = item.ExternalId;
if (string.IsNullOrWhiteSpace(externalId))
{
externalId = item.GetProviderId("ProviderExternalId");
}
return externalId;
}
private readonly SemaphoreSlim _resourcePool = new SemaphoreSlim(1, 1);
private async Task<ChannelItemResult> GetChannelItems(IChannel channel,
User user,
@@ -1080,7 +1068,7 @@ namespace Emby.Server.Implementations.Channels
{
var categoryItem = _libraryManager.GetItemById(new Guid(folderId));
query.FolderId = GetItemExternalId(categoryItem);
query.FolderId = categoryItem.ExternalId;
}
var result = await channel.GetChannelItems(query, cancellationToken).ConfigureAwait(false);

View File

@@ -373,6 +373,8 @@ namespace Emby.Server.Implementations.Dto
}
NormalizeMediaSourceContainers(dto);
dto.SupportsMediaSourceSelection = hasMediaSources.SupportsMediaSourceSelection();
}
}

View File

@@ -487,14 +487,17 @@ namespace Emby.Server.Implementations.IO
AssertDirectoryExists(dir, path);
var list = ListFiles(dir, recursive);
var result = new List<FileSystemMetadata>();
foreach (var file in list)
{
if (file.IsDirectory())
{
yield return ToMetadata(file);
result.Add(ToMetadata(file));
}
}
return result;
}
public IEnumerable<FileSystemMetadata> GetFiles(string path, string[] extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
@@ -503,6 +506,7 @@ namespace Emby.Server.Implementations.IO
AssertDirectoryExists(dir, path);
var list = ListFiles(dir, recursive);
var result = new List<FileSystemMetadata>();
foreach (var file in list)
{
@@ -513,10 +517,12 @@ namespace Emby.Server.Implementations.IO
if (extensions == null || extensions.Length == 0 || extensions.Contains(extension ?? string.Empty, StringComparer.OrdinalIgnoreCase))
{
yield return ToMetadata(file);
result.Add(ToMetadata(file));
}
}
}
return result;
}
public IEnumerable<FileSystemMetadata> GetFileSystemEntries(string path, bool recursive = false)
@@ -525,15 +531,19 @@ namespace Emby.Server.Implementations.IO
AssertDirectoryExists(dir, path);
var list = ListFiles(dir, recursive);
var result = new List<FileSystemMetadata>();
foreach (var file in list)
{
yield return ToMetadata(file);
result.Add(ToMetadata(file));
}
return result;
}
public IEnumerable<string> GetFileSystemEntryPaths(string path, bool recursive = false)
public List<string> GetFileSystemEntryPaths(string path, bool recursive = false)
{
var result = new List<string>();
var dir = CreateSmbDirectoryForListFiles(path);
AssertDirectoryExists(dir, path);
@@ -541,16 +551,18 @@ namespace Emby.Server.Implementations.IO
foreach (var file in list)
{
yield return GetReturnPath(file);
result.Add(GetReturnPath(file));
}
return result;
}
public IEnumerable<string> GetFilePaths(string path, string[] extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
public List<string> GetFilePaths(string path, string[] extensions, bool enableCaseSensitiveExtensions, bool recursive = false)
{
var dir = CreateSmbDirectoryForListFiles(path);
AssertDirectoryExists(dir, path);
var list = ListFiles(dir, recursive);
var result = new List<string>();
foreach (var file in list)
{
@@ -561,44 +573,52 @@ namespace Emby.Server.Implementations.IO
if (extensions == null || extensions.Length == 0 || extensions.Contains(extension ?? string.Empty, StringComparer.OrdinalIgnoreCase))
{
yield return filePath;
result.Add(filePath);
}
}
}
return result;
}
public IEnumerable<string> GetDirectoryPaths(string path, bool recursive = false)
public List<string> GetDirectoryPaths(string path, bool recursive = false)
{
var dir = CreateSmbDirectoryForListFiles(path);
AssertDirectoryExists(dir, path);
var list = ListFiles(dir, recursive);
var result = new List<string>();
foreach (var file in list)
{
if (file.IsDirectory())
{
yield return GetReturnPath(file);
result.Add(GetReturnPath(file));
}
}
return result;
}
private IEnumerable<SmbFile> ListFiles(SmbFile dir, bool recursive)
{
var list = dir.ListFiles();
var result = new List<SmbFile>();
foreach (var file in list)
{
yield return file;
result.Add(file);
if (recursive && file.IsDirectory())
{
foreach (var subFile in ListFiles(file, recursive))
{
yield return subFile;
result.Add(subFile);
}
}
}
return result;
}
}
}

View File

@@ -274,7 +274,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
return false;
}
return FileSystem.GetFilePaths(fullPath).Any(i => string.Equals(Path.GetExtension(i), ".vob", StringComparison.OrdinalIgnoreCase));
return directoryService.GetFilePaths(fullPath).Any(i => string.Equals(Path.GetExtension(i), ".vob", StringComparison.OrdinalIgnoreCase));
}
/// <summary>

View File

@@ -2445,6 +2445,10 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{
existingTimer.Status = RecordingStatus.Cancelled;
}
else if (!existingTimer.IsManual)
{
existingTimer.Status = RecordingStatus.New;
}
if (existingTimer.Status != RecordingStatus.Cancelled)
{

View File

@@ -1232,6 +1232,8 @@ namespace Emby.Server.Implementations.LiveTv
var newChannelIdList = new List<Guid>();
var newProgramIdList = new List<Guid>();
var cleanDatabase = true;
foreach (var service in _services)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -1254,6 +1256,7 @@ namespace Emby.Server.Implementations.LiveTv
}
catch (Exception ex)
{
cleanDatabase = false;
_logger.ErrorException("Error refreshing channels for service", ex);
}
@@ -1264,8 +1267,11 @@ namespace Emby.Server.Implementations.LiveTv
progress.Report(100 * percent);
}
await CleanDatabaseInternal(newChannelIdList.ToArray(), new[] { typeof(LiveTvChannel).Name }, progress, cancellationToken).ConfigureAwait(false);
await CleanDatabaseInternal(newProgramIdList.ToArray(), new[] { typeof(LiveTvProgram).Name }, progress, cancellationToken).ConfigureAwait(false);
if (cleanDatabase)
{
await CleanDatabaseInternal(newChannelIdList.ToArray(), new[] { typeof(LiveTvChannel).Name }, progress, cancellationToken).ConfigureAwait(false);
await CleanDatabaseInternal(newProgramIdList.ToArray(), new[] { typeof(LiveTvProgram).Name }, progress, cancellationToken).ConfigureAwait(false);
}
var coreService = _services.OfType<EmbyTV.EmbyTV>().FirstOrDefault();
@@ -1291,8 +1297,9 @@ namespace Emby.Server.Implementations.LiveTv
{
progress.Report(10);
var allChannels = await GetChannels(service, cancellationToken).ConfigureAwait(false);
var allChannelsList = allChannels.ToList();
var allChannelsList = (await service.GetChannelsAsync(cancellationToken).ConfigureAwait(false))
.Select(i => new Tuple<string, ChannelInfo>(service.Name, i))
.ToList();
var list = new List<LiveTvChannel>();
@@ -1507,13 +1514,6 @@ namespace Emby.Server.Implementations.LiveTv
return 7;
}
private async Task<IEnumerable<Tuple<string, ChannelInfo>>> GetChannels(ILiveTvService service, CancellationToken cancellationToken)
{
var channels = await service.GetChannelsAsync(cancellationToken).ConfigureAwait(false);
return channels.Select(i => new Tuple<string, ChannelInfo>(service.Name, i));
}
private DateTime _lastRecordingRefreshTime;
private async Task RefreshRecordings(Guid internalLiveTvFolderId, CancellationToken cancellationToken)
{

View File

@@ -73,9 +73,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
//OpenedMediaSource.SupportsTranscoding = true;
}
public override void Close()
protected override void CloseInternal()
{
Logger.Info("Closing HDHR live stream");
LiveStreamCancellationTokenSource.Cancel();
}
@@ -106,7 +105,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{
Logger.ErrorException("Error copying live stream.", ex);
}
EnableStreamSharing = false;
await DeleteTempFile(TempFilePath).ConfigureAwait(false);
});
}

View File

@@ -105,9 +105,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
await taskCompletionSource.Task.ConfigureAwait(false);
}
public override void Close()
protected override void CloseInternal()
{
Logger.Info("Closing HDHR UDP live stream");
LiveStreamCancellationTokenSource.Cancel();
}
@@ -134,6 +133,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
openTaskCompletionSource.TrySetException(ex);
}
EnableStreamSharing = false;
try
{
await hdHomerunManager.StopStreaming().ConfigureAwait(false);

View File

@@ -52,7 +52,16 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
return Task.FromResult(true);
}
public virtual void Close()
public void Close()
{
EnableStreamSharing = false;
Logger.Info("Closing " + GetType().Name);
CloseInternal();
}
protected virtual void CloseInternal()
{
}

View File

@@ -1,7 +1,7 @@
{
"Latest": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438",
"ValueSpecialEpisodeName": "\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u043d\u0438 - {0}",
"Inherit": "Inherit",
"Inherit": "\u041d\u0430\u0441\u043b\u0435\u0434\u044f\u0432\u0430\u043d\u0435",
"Books": "\u041a\u043d\u0438\u0433\u0438",
"Music": "\u041c\u0443\u0437\u0438\u043a\u0430",
"Games": "\u0418\u0433\u0440\u0438",
@@ -35,7 +35,7 @@
"UserDownloadingItemWithValues": "{0} is downloading {1}",
"HeaderLiveTV": "\u0422\u0435\u043b\u0435\u0432\u0438\u0437\u0438\u044f \u043d\u0430 \u0436\u0438\u0432\u043e",
"ChapterNameValue": "\u0413\u043b\u0430\u0432\u0430 {0}",
"ScheduledTaskFailedWithName": "{0} failed",
"ScheduledTaskFailedWithName": "{0} \u0441\u0435 \u043f\u0440\u043e\u0432\u0430\u043b\u0438",
"LabelRunningTimeValue": "Running time: {0}",
"ScheduledTaskStartedWithName": "{0} \u0437\u0430\u043f\u043e\u0447\u043d\u0430",
"VersionNumber": "\u0412\u0435\u0440\u0441\u0438\u044f {0}",
@@ -49,40 +49,40 @@
"DeviceOnlineWithName": "{0} \u0435 \u0441\u0432\u044a\u0440\u0437\u0430\u043d",
"UserOnlineFromDevice": "{0} \u0435 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f \u043e\u0442 {1}",
"ProviderValue": "\u0414\u043e\u0441\u0442\u0430\u0432\u0447\u0438\u043a: {0}",
"SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",
"UserCreatedWithName": "User {0} has been created",
"UserPasswordChangedWithName": "Password has been changed for user {0}",
"UserDeletedWithName": "User {0} has been deleted",
"SubtitlesDownloadedForItem": "\u0418\u0437\u0442\u0435\u0433\u043b\u0435\u043d\u0438 \u0441\u0430 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u0438 \u0437\u0430 {0}",
"UserCreatedWithName": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u0442 {0} \u0435 \u0441\u044a\u0437\u0434\u0430\u0434\u0435\u043d",
"UserPasswordChangedWithName": "\u041f\u0430\u0440\u043e\u043b\u0430\u0442\u0430 \u043d\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f {0} \u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0435\u043d\u0430",
"UserDeletedWithName": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u0442 {0} \u0435 \u0438\u0437\u0442\u0440\u0438\u0442",
"UserConfigurationUpdatedWithName": "User configuration has been updated for {0}",
"MessageServerConfigurationUpdated": "Server configuration has been updated",
"MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated",
"MessageApplicationUpdated": "Emby Server has been updated",
"MessageApplicationUpdated": "\u0421\u044a\u0440\u0432\u044a\u0440\u044a\u0442 \u0435 \u043e\u0431\u043d\u043e\u0432\u0435\u043d",
"FailedLoginAttemptWithUserName": "Failed login attempt from {0}",
"AuthenticationSucceededWithUserName": "{0} successfully authenticated",
"UserOfflineFromDevice": "{0} has disconnected from {1}",
"DeviceOfflineWithName": "{0} has disconnected",
"AuthenticationSucceededWithUserName": "{0} \u0441\u0435 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e",
"UserOfflineFromDevice": "{0} \u0441\u0435 \u0440\u0430\u0437\u043a\u0430\u0447\u0438 \u043e\u0442 {1}",
"DeviceOfflineWithName": "{0} \u0441\u0435 \u0440\u0430\u0437\u043a\u0430\u0447\u0438",
"UserStartedPlayingItemWithValues": "{0} has started playing {1}",
"UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}",
"NotificationOptionPluginError": "Plugin failure",
"NotificationOptionApplicationUpdateAvailable": "Application update available",
"NotificationOptionApplicationUpdateInstalled": "Application update installed",
"NotificationOptionPluginError": "\u0413\u0440\u0435\u0448\u043a\u0430 \u0432 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430",
"NotificationOptionApplicationUpdateAvailable": "\u041d\u0430\u043b\u0438\u0447\u043d\u043e \u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430\u0442\u0430",
"NotificationOptionApplicationUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430\u0442\u0430 \u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u043e",
"NotificationOptionPluginUpdateInstalled": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u043e \u043d\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u043e",
"NotificationOptionPluginInstalled": "\u041f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430",
"NotificationOptionPluginUninstalled": "\u041f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0434\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430",
"NotificationOptionVideoPlayback": "Video playback started",
"NotificationOptionAudioPlayback": "Audio playback started",
"NotificationOptionGamePlayback": "Game playback started",
"NotificationOptionVideoPlaybackStopped": "Video playback stopped",
"NotificationOptionAudioPlaybackStopped": "Audio playback stopped",
"NotificationOptionGamePlaybackStopped": "Game playback stopped",
"NotificationOptionTaskFailed": "Scheduled task failure",
"NotificationOptionInstallationFailed": "Installation failure",
"NotificationOptionVideoPlayback": "\u0412\u044a\u0437\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0436\u0434\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u0437\u0430\u043f\u043e\u0447\u043d\u0430",
"NotificationOptionAudioPlayback": "\u0412\u044a\u0437\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0436\u0434\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0437\u0432\u0443\u043a \u0437\u0430\u043f\u043e\u0447\u043d\u0430",
"NotificationOptionGamePlayback": "\u0412\u044a\u0437\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0436\u0434\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0438\u0433\u0440\u0430\u0442\u0430 \u0437\u0430\u043f\u043e\u0447\u043d\u0430",
"NotificationOptionVideoPlaybackStopped": "\u0412\u044a\u0437\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0436\u0434\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u0435 \u0441\u043f\u0440\u044f\u043d\u043e",
"NotificationOptionAudioPlaybackStopped": "\u0412\u044a\u0437\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0436\u0434\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0437\u0432\u0443\u043a \u0435 \u0441\u043f\u0440\u044f\u043d\u043e",
"NotificationOptionGamePlaybackStopped": "\u0412\u044a\u0437\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0436\u0434\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0438\u0433\u0440\u0430\u0442\u0430 \u0435 \u0441\u043f\u0440\u044f\u043d\u0430",
"NotificationOptionTaskFailed": "\u0413\u0440\u0435\u0448\u043a\u0430 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u0430\u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430",
"NotificationOptionInstallationFailed": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0435",
"NotificationOptionNewLibraryContent": "\u0414\u043e\u0431\u0430\u0432\u0435\u043d\u043e \u0435 \u043d\u043e\u0432\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435",
"NotificationOptionCameraImageUploaded": "Camera image uploaded",
"NotificationOptionCameraImageUploaded": "\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u0442\u043e \u043e\u0442 \u0444\u043e\u0442\u043e\u0430\u043f\u0430\u0440\u0430\u0442\u0430 \u0435 \u043a\u0430\u0447\u0435\u043d\u043e",
"NotificationOptionUserLockedOut": "User locked out",
"NotificationOptionServerRestartRequired": "\u041d\u0443\u0436\u043d\u043e \u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0443\u0441\u043a\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430",
"UserLockedOutWithName": "User {0} has been locked out",
"SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
"SubtitleDownloadFailureForItem": "\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u0442\u0435\u0433\u043b\u044f\u043d\u0435 \u043d\u0430 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u0438 \u0437\u0430 {0}",
"Sync": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0430\u043d\u0435",
"User": "\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b",
"System": "\u0421\u0438\u0441\u0442\u0435\u043c\u0430",

View File

@@ -2,13 +2,13 @@
"Latest": "Latest",
"ValueSpecialEpisodeName": "Special - {0}",
"Inherit": "Inherit",
"Books": "Books",
"Music": "Music",
"Games": "Games",
"Photos": "Photos",
"MixedContent": "Mixed content",
"MusicVideos": "Music videos",
"HomeVideos": "Home videos",
"Books": "Knihy",
"Music": "Hudba",
"Games": "Hry",
"Photos": "Fotky",
"MixedContent": "Zmie\u0161an\u00fd obsah",
"MusicVideos": "Hudobn\u00e9 vide\u00e1",
"HomeVideos": "Dom\u00e1ce vide\u00e1",
"Playlists": "Playlists",
"HeaderRecordingGroups": "Recording Groups",
"HeaderContinueWatching": "Continue Watching",
@@ -16,20 +16,20 @@
"HeaderFavoriteSongs": "Ob\u013e\u00faben\u00e9 pesni\u010dky",
"HeaderAlbumArtists": "Album Artists",
"HeaderFavoriteAlbums": "Favorite Albums",
"HeaderFavoriteEpisodes": "Favorite Episodes",
"HeaderFavoriteEpisodes": "Ob\u013e\u00faben\u00e9 epiz\u00f3dy",
"HeaderFavoriteShows": "Ob\u013e\u00faben\u00e9 seri\u00e1ly",
"HeaderNextUp": "Next Up",
"HeaderNextUp": "Nasleduje",
"Favorites": "Ob\u013e\u00faben\u00e9",
"Collections": "Collections",
"Channels": "Channels",
"Movies": "Movies",
"Albums": "Albums",
"Artists": "Artists",
"Folders": "Folders",
"Songs": "Songs",
"Collections": "Zbierky",
"Channels": "Kan\u00e1ly",
"Movies": "Filmy",
"Albums": "Albumy",
"Artists": "Umelci",
"Folders": "Prie\u010dinky",
"Songs": "Skladby",
"TvShows": "TV Shows",
"Shows": "Series",
"Genres": "Genres",
"Genres": "\u017d\u00e1nre",
"NameSeasonNumber": "Season {0}",
"AppDeviceValues": "App: {0}, Device: {1}",
"UserDownloadingItemWithValues": "{0} is downloading {1}",
@@ -86,6 +86,6 @@
"Sync": "Sync",
"User": "User",
"System": "System",
"Application": "Application",
"Application": "Aplik\u00e1cia",
"Plugin": "Plugin"
}

View File

@@ -27,7 +27,7 @@
"Artists": "Artister",
"Folders": "Mappar",
"Songs": "L\u00e5tar",
"TvShows": "TV Shows",
"TvShows": "TV-serier",
"Shows": "Serier",
"Genres": "Genrer",
"NameSeasonNumber": "S\u00e4song {0}",

View File

@@ -64,7 +64,7 @@ namespace Emby.Server.Implementations.Localization
var localizationPath = LocalizationPath;
_fileSystem.CreateDirectory(localizationPath);
_fileSystem.CreateDirectory(localizationPath);
var existingFiles = GetRatingsFiles(localizationPath)
.Select(Path.GetFileName)
@@ -91,7 +91,7 @@ namespace Emby.Server.Implementations.Localization
}
}
}
foreach (var file in GetRatingsFiles(localizationPath))
{
LoadRatings(file);
@@ -128,12 +128,20 @@ namespace Emby.Server.Implementations.Localization
return _textLocalizer.NormalizeFormKD(text);
}
private CultureDto[] _cultures;
/// <summary>
/// Gets the cultures.
/// </summary>
/// <returns>IEnumerable{CultureDto}.</returns>
public CultureDto[] GetCultures()
{
var result = _cultures;
if (result != null)
{
return result;
}
var type = GetType();
var path = type.Namespace + ".iso6392.txt";
@@ -166,10 +174,14 @@ namespace Emby.Server.Implementations.Localization
}
}
return list.Where(i => !string.IsNullOrWhiteSpace(i.Name) &&
!string.IsNullOrWhiteSpace(i.DisplayName) &&
!string.IsNullOrWhiteSpace(i.ThreeLetterISOLanguageName) &&
!string.IsNullOrWhiteSpace(i.TwoLetterISOLanguageName)).ToArray();
result = list.Where(i => !string.IsNullOrWhiteSpace(i.Name) &&
!string.IsNullOrWhiteSpace(i.DisplayName) &&
!string.IsNullOrWhiteSpace(i.ThreeLetterISOLanguageName) &&
!string.IsNullOrWhiteSpace(i.TwoLetterISOLanguageName)).ToArray();
_cultures = result;
return result;
}
/// <summary>
@@ -239,7 +251,7 @@ namespace Emby.Server.Implementations.Localization
/// <returns>Dictionary{System.StringParentalRating}.</returns>
private void LoadRatings(string file)
{
var dict = _fileSystem.ReadAllLines(file).Select(i =>
var dict = _fileSystem.ReadAllLines(file).Select(i =>
{
if (!string.IsNullOrWhiteSpace(i))
{
@@ -269,7 +281,7 @@ namespace Emby.Server.Implementations.Localization
_allParentalRatings.TryAdd(countryCode, dict);
}
private readonly string[] _unratedValues = {"n/a", "unrated", "not rated"};
private readonly string[] _unratedValues = { "n/a", "unrated", "not rated" };
/// <summary>
/// Gets the rating level.

View File

@@ -17,6 +17,7 @@ using System.Threading.Tasks;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
namespace Emby.Server.Implementations.MediaEncoder
{
@@ -89,7 +90,7 @@ namespace Emby.Server.Implementations.MediaEncoder
/// </summary>
private static readonly long FirstChapterTicks = TimeSpan.FromSeconds(15).Ticks;
public async Task<bool> RefreshChapterImages(Video video, List<ChapterInfo> chapters, bool extractImages, bool saveChapters, CancellationToken cancellationToken)
public async Task<bool> RefreshChapterImages(Video video, IDirectoryService directoryService, List<ChapterInfo> chapters, bool extractImages, bool saveChapters, CancellationToken cancellationToken)
{
if (!IsEligibleForChapterImageExtraction(video))
{
@@ -101,7 +102,7 @@ namespace Emby.Server.Implementations.MediaEncoder
var runtimeTicks = video.RunTimeTicks ?? 0;
var currentImages = GetSavedChapterImages(video);
var currentImages = GetSavedChapterImages(video, directoryService);
foreach (var chapter in chapters)
{
@@ -194,13 +195,13 @@ namespace Emby.Server.Implementations.MediaEncoder
return Path.Combine(GetChapterImagesPath(video), filename);
}
private List<string> GetSavedChapterImages(Video video)
private List<string> GetSavedChapterImages(Video video, IDirectoryService directoryService)
{
var path = GetChapterImagesPath(video);
try
{
return _fileSystem.GetFilePaths(path)
return directoryService.GetFilePaths(path)
.ToList();
}
catch (IOException)

View File

@@ -16,6 +16,7 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Tasks;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Controller.Providers;
namespace Emby.Server.Implementations.ScheduledTasks
{
@@ -120,6 +121,8 @@ namespace Emby.Server.Implementations.ScheduledTasks
previouslyFailedImages = new List<string>();
}
var directoryService = new DirectoryService(_fileSystem);
foreach (var video in videos)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -132,7 +135,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
{
var chapters = _itemRepo.GetChapters(video.Id);
var success = await _encodingManager.RefreshChapterImages(video, chapters, extract, true, CancellationToken.None);
var success = await _encodingManager.RefreshChapterImages(video, directoryService, chapters, extract, true, CancellationToken.None);
if (!success)
{