From ed774622d030c3bdf9ca4f6d4fad6ea448278ab0 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 7 Dec 2015 11:51:10 -0500 Subject: [PATCH 1/7] 3.0.5781.5 --- SharedVersion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SharedVersion.cs b/SharedVersion.cs index 83969cb188..e1a4ca04b2 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; //[assembly: AssemblyVersion("3.0.*")] -[assembly: AssemblyVersion("3.0.5781.4")] +[assembly: AssemblyVersion("3.0.5781.5")] From d3a97e63f0d4ab3dbe3de8d3e1d96ed31d7c59e9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 10 Dec 2015 11:06:48 -0500 Subject: [PATCH 2/7] update translations --- .../Localization/Core/ca.json | 42 ++--- .../Localization/Core/he.json | 52 ++--- .../Localization/Core/hu.json | 177 ++++++++++++++++++ .../Localization/Core/pl.json | 4 +- 4 files changed, 226 insertions(+), 49 deletions(-) create mode 100644 MediaBrowser.Server.Implementations/Localization/Core/hu.json diff --git a/MediaBrowser.Server.Implementations/Localization/Core/ca.json b/MediaBrowser.Server.Implementations/Localization/Core/ca.json index 233e3a18dd..c0fffff1f1 100644 --- a/MediaBrowser.Server.Implementations/Localization/Core/ca.json +++ b/MediaBrowser.Server.Implementations/Localization/Core/ca.json @@ -2,14 +2,14 @@ "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", - "FolderTypeMusic": "Music", + "FolderTypeMovies": "Pel\u00b7l\u00edcules", + "FolderTypeMusic": "M\u00fasica", "FolderTypeAdultVideos": "Adult videos", "FolderTypePhotos": "Fotos", - "FolderTypeMusicVideos": "Music videos", + "FolderTypeMusicVideos": "V\u00eddeos musicals", "FolderTypeHomeVideos": "V\u00eddeos dom\u00e8stics", - "FolderTypeGames": "Games", - "FolderTypeBooks": "Books", + "FolderTypeGames": "Jocs", + "FolderTypeBooks": "Llibres", "FolderTypeTvShows": "TV", "FolderTypeInherit": "Heretat", "HeaderCastCrew": "Repartiment i equip", @@ -24,7 +24,7 @@ "LabelDeveloperResources": "Recursos per a programadors", "LabelBrowseLibrary": "Examina la biblioteca", "LabelConfigureServer": "Configura Emby", - "LabelRestartServer": "Reiniciar el servidor", + "LabelRestartServer": "Reiniciar Servidor", "CategorySync": "Sync", "CategoryUser": "Usuari", "CategorySystem": "Sistema", @@ -44,8 +44,8 @@ "NotificationOptionGamePlaybackStopped": "Game playback stopped", "NotificationOptionTaskFailed": "Scheduled task failure", "NotificationOptionInstallationFailed": "Installation failure", - "NotificationOptionNewLibraryContent": "New content added", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", + "NotificationOptionNewLibraryContent": "Nou contingut afegit", + "NotificationOptionNewLibraryContentMultiple": "Nous continguts afegits", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", "NotificationOptionServerRestartRequired": "Server restart required", @@ -76,21 +76,21 @@ "ViewTypeMovieLatest": "Darrers", "ViewTypeMovieMovies": "Pel\u00b7l\u00edcules", "ViewTypeMovieCollections": "Col\u00b7leccions", - "ViewTypeMovieFavorites": "Preferits", + "ViewTypeMovieFavorites": "Preferides", "ViewTypeMovieGenres": "Genres", - "ViewTypeMusicLatest": "Latest", + "ViewTypeMusicLatest": "Novetats", "ViewTypeMusicPlaylists": "Llistes de reproducci\u00f3", - "ViewTypeMusicAlbums": "Albums", + "ViewTypeMusicAlbums": "\u00c0lbums", "ViewTypeMusicAlbumArtists": "Album Artists", "HeaderOtherDisplaySettings": "Prefer\u00e8ncies de Visualitzaci\u00f3", - "ViewTypeMusicSongs": "Songs", - "ViewTypeMusicFavorites": "Preferits", - "ViewTypeMusicFavoriteAlbums": "Favorite Albums", - "ViewTypeMusicFavoriteArtists": "Favorite Artists", + "ViewTypeMusicSongs": "Can\u00e7ons", + "ViewTypeMusicFavorites": "Preferides", + "ViewTypeMusicFavoriteAlbums": "\u00c0lbums Preferits", + "ViewTypeMusicFavoriteArtists": "Artistes Preferits", "ViewTypeMusicFavoriteSongs": "Can\u00e7ons Preferides", - "ViewTypeFolders": "Folders", + "ViewTypeFolders": "Directoris", "ViewTypeLiveTvRecordingGroups": "Recordings", - "ViewTypeLiveTvChannels": "Channels", + "ViewTypeLiveTvChannels": "Canals", "ScheduledTaskFailedWithName": "{0} failed", "LabelRunningTimeValue": "Running time: {0}", "ScheduledTaskStartedWithName": "{0} started", @@ -98,8 +98,8 @@ "PluginInstalledWithName": "{0} was installed", "PluginUpdatedWithName": "{0} was updated", "PluginUninstalledWithName": "{0} was uninstalled", - "ItemAddedWithName": "{0} was added to the library", - "ItemRemovedWithName": "{0} was removed from the library", + "ItemAddedWithName": "{0} afegit a la biblioteca", + "ItemRemovedWithName": "{0} eliminat de la biblioteca", "LabelIpAddressValue": "Ip address: {0}", "DeviceOnlineWithName": "{0} is connected", "UserOnlineFromDevice": "{0} is online from {1}", @@ -145,7 +145,7 @@ "HeaderYears": "Anys:", "HeaderParentalRating": "Parental Rating", "HeaderCommunityRating": "Community rating", - "HeaderTrailers": "Trailers", + "HeaderTrailers": "Tr\u00e0ilers", "HeaderSpecials": "Specials", "HeaderGameSystems": "Sistemes de Jocs", "HeaderPlayers": "Jugadors:", @@ -162,7 +162,7 @@ "HeaderCountries": "Countries", "HeaderStatus": "Estat", "HeaderTracks": "Tracks", - "HeaderMusicArtist": "Musics", + "HeaderMusicArtist": "M\u00fasic", "HeaderLocked": "Locked", "HeaderStudios": "Studios", "HeaderActor": "Actors", diff --git a/MediaBrowser.Server.Implementations/Localization/Core/he.json b/MediaBrowser.Server.Implementations/Localization/Core/he.json index a664384821..f900946f1f 100644 --- a/MediaBrowser.Server.Implementations/Localization/Core/he.json +++ b/MediaBrowser.Server.Implementations/Localization/Core/he.json @@ -1,8 +1,8 @@ { "AppDeviceValues": "App: {0}, Device: {1}", "UserDownloadingItemWithValues": "{0} is downloading {1}", - "FolderTypeMixed": "Mixed content", - "FolderTypeMovies": "Movies", + "FolderTypeMixed": "\u05ea\u05d5\u05db\u05df \u05de\u05e2\u05d5\u05e8\u05d1", + "FolderTypeMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", "FolderTypeMusic": "Music", "FolderTypeAdultVideos": "Adult videos", "FolderTypePhotos": "Photos", @@ -10,7 +10,7 @@ "FolderTypeHomeVideos": "Home videos", "FolderTypeGames": "Games", "FolderTypeBooks": "Books", - "FolderTypeTvShows": "TV", + "FolderTypeTvShows": "\u05d8\u05dc\u05d5\u05d9\u05d6\u05d9\u05d4", "FolderTypeInherit": "Inherit", "HeaderCastCrew": "\u05e9\u05d7\u05e7\u05e0\u05d9\u05dd \u05d5\u05e6\u05d5\u05d5\u05ea", "HeaderPeople": "People", @@ -20,38 +20,38 @@ "LabelExit": "\u05d9\u05e6\u05d9\u05d0\u05d4", "LabelVisitCommunity": "\u05d1\u05e7\u05e8 \u05d1\u05e7\u05d4\u05d9\u05dc\u05d4", "LabelGithub": "Github", - "LabelApiDocumentation": "Api Documentation", + "LabelApiDocumentation": "\u05ea\u05d9\u05e2\u05d5\u05d3 API", "LabelDeveloperResources": "Developer Resources", - "LabelBrowseLibrary": "\u05d3\u05e4\u05d3\u05e3 \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05d4", - "LabelConfigureServer": "Configure Emby", + "LabelBrowseLibrary": "\u05d3\u05e4\u05d3\u05e3 \u05d1\u05e1\u05e4\u05e8\u05d9\u05d4", + "LabelConfigureServer": "\u05e7\u05d1\u05e2 \u05ea\u05e6\u05d5\u05e8\u05ea Emby", "LabelRestartServer": "\u05d0\u05ea\u05d7\u05dc \u05d0\u05ea \u05d4\u05e9\u05e8\u05ea", - "CategorySync": "Sync", + "CategorySync": "\u05e1\u05e0\u05db\u05e8\u05df", "CategoryUser": "\u05de\u05e9\u05ea\u05de\u05e9", "CategorySystem": "\u05de\u05e2\u05e8\u05db\u05ea", "CategoryApplication": "Application", "CategoryPlugin": "Plugin", - "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionPluginError": "\u05ea\u05e7\u05dc\u05d4 \u05d1\u05ea\u05d5\u05e1\u05e3", "NotificationOptionApplicationUpdateAvailable": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05db\u05de\u05d4 \u05e7\u05d9\u05d9\u05dd", "NotificationOptionApplicationUpdateInstalled": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05db\u05e0\u05d4 \u05d4\u05d5\u05ea\u05e7\u05df", "NotificationOptionPluginUpdateInstalled": "\u05e2\u05d3\u05db\u05d5\u05df \u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05ea\u05e7\u05df", "NotificationOptionPluginInstalled": "\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05ea\u05e7\u05df", "NotificationOptionPluginUninstalled": "\u05ea\u05d5\u05e1\u05e3 \u05d4\u05d5\u05e1\u05e8", - "NotificationOptionVideoPlayback": "Video playback started", - "NotificationOptionAudioPlayback": "Audio playback started", + "NotificationOptionVideoPlayback": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d4\u05d7\u05dc\u05d4", + "NotificationOptionAudioPlayback": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05e6\u05dc\u05d9\u05dc \u05d4\u05d7\u05dc\u05d4", "NotificationOptionGamePlayback": "Game playback started", - "NotificationOptionVideoPlaybackStopped": "Video playback stopped", - "NotificationOptionAudioPlaybackStopped": "Audio playback stopped", + "NotificationOptionVideoPlaybackStopped": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4", + "NotificationOptionAudioPlaybackStopped": "\u05e0\u05d2\u05d9\u05e0\u05ea \u05e6\u05dc\u05d9\u05dc \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4", "NotificationOptionGamePlaybackStopped": "Game playback stopped", "NotificationOptionTaskFailed": "\u05de\u05e9\u05d9\u05de\u05d4 \u05de\u05ea\u05d5\u05d6\u05de\u05e0\u05ea \u05e0\u05db\u05e9\u05dc\u05d4", "NotificationOptionInstallationFailed": "\u05d4\u05ea\u05e7\u05e0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4", "NotificationOptionNewLibraryContent": "\u05ea\u05d5\u05db\u05df \u05d7\u05d3\u05e9 \u05e0\u05d5\u05e1\u05e3", - "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", + "NotificationOptionNewLibraryContentMultiple": "\u05d4\u05ea\u05d5\u05d5\u05e1\u05e4\u05d5 \u05ea\u05db\u05e0\u05d9\u05dd \u05d7\u05d3\u05e9\u05d9\u05dd", "NotificationOptionCameraImageUploaded": "Camera image uploaded", "NotificationOptionUserLockedOut": "User locked out", "NotificationOptionServerRestartRequired": "\u05e0\u05d3\u05e8\u05e9\u05ea \u05d4\u05e4\u05e2\u05dc\u05d4 \u05de\u05d7\u05d3\u05e9 \u05e9\u05dc \u05d4\u05e9\u05e8\u05ea", "ViewTypePlaylists": "Playlists", - "ViewTypeMovies": "Movies", - "ViewTypeTvShows": "TV", + "ViewTypeMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", + "ViewTypeTvShows": "\u05d8\u05dc\u05d5\u05d9\u05d6\u05d9\u05d4", "ViewTypeGames": "Games", "ViewTypeMusic": "Music", "ViewTypeMusicGenres": "Genres", @@ -74,7 +74,7 @@ "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", "ViewTypeMovieResume": "Resume", "ViewTypeMovieLatest": "Latest", - "ViewTypeMovieMovies": "Movies", + "ViewTypeMovieMovies": "\u05e1\u05e8\u05d8\u05d9\u05dd", "ViewTypeMovieCollections": "Collections", "ViewTypeMovieFavorites": "Favorites", "ViewTypeMovieGenres": "Genres", @@ -133,16 +133,16 @@ "HeaderName": "\u05e9\u05dd", "HeaderDate": "\u05ea\u05d0\u05e8\u05d9\u05da", "HeaderPremiereDate": "Premiere Date", - "HeaderDateAdded": "Date Added", + "HeaderDateAdded": "\u05ea\u05d0\u05e8\u05d9\u05da \u05d4\u05d5\u05e1\u05e4\u05d4", "HeaderReleaseDate": "Release date", "HeaderRuntime": "Runtime", "HeaderPlayCount": "Play Count", "HeaderSeason": "Season", "HeaderSeasonNumber": "Season number", - "HeaderSeries": "Series:", + "HeaderSeries": "\u05e1\u05d3\u05e8\u05d4", "HeaderNetwork": "Network", - "HeaderYear": "Year:", - "HeaderYears": "Years:", + "HeaderYear": "\u05e9\u05e0\u05d4", + "HeaderYears": "\u05e9\u05e0\u05d9\u05dd", "HeaderParentalRating": "Parental Rating", "HeaderCommunityRating": "Community rating", "HeaderTrailers": "Trailers", @@ -165,12 +165,12 @@ "HeaderMusicArtist": "Music artist", "HeaderLocked": "Locked", "HeaderStudios": "Studios", - "HeaderActor": "Actors", - "HeaderComposer": "Composers", - "HeaderDirector": "Directors", - "HeaderGuestStar": "Guest star", - "HeaderProducer": "Producers", - "HeaderWriter": "Writers", + "HeaderActor": "\u05e9\u05d7\u05e7\u05e0\u05d9\u05dd", + "HeaderComposer": "\u05de\u05dc\u05d7\u05d9\u05e0\u05d9\u05dd", + "HeaderDirector": "\u05d1\u05de\u05d0\u05d9\u05dd", + "HeaderGuestStar": "\u05d0\u05de\u05df \u05d0\u05d5\u05e8\u05d7", + "HeaderProducer": "\u05de\u05e4\u05d9\u05e7\u05d9\u05dd", + "HeaderWriter": "\u05db\u05d5\u05ea\u05d1\u05d9\u05dd", "HeaderParentalRatings": "Parental Ratings", "HeaderCommunityRatings": "Community ratings", "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." diff --git a/MediaBrowser.Server.Implementations/Localization/Core/hu.json b/MediaBrowser.Server.Implementations/Localization/Core/hu.json new file mode 100644 index 0000000000..546e704a4b --- /dev/null +++ b/MediaBrowser.Server.Implementations/Localization/Core/hu.json @@ -0,0 +1,177 @@ +{ + "AppDeviceValues": "App: {0}, Device: {1}", + "UserDownloadingItemWithValues": "{0} is downloading {1}", + "FolderTypeMixed": "Mixed content", + "FolderTypeMovies": "Movies", + "FolderTypeMusic": "Music", + "FolderTypeAdultVideos": "Adult videos", + "FolderTypePhotos": "Photos", + "FolderTypeMusicVideos": "Music videos", + "FolderTypeHomeVideos": "Home videos", + "FolderTypeGames": "Games", + "FolderTypeBooks": "Books", + "FolderTypeTvShows": "TV", + "FolderTypeInherit": "Inherit", + "HeaderCastCrew": "Cast & Crew", + "HeaderPeople": "People", + "ValueSpecialEpisodeName": "Special - {0}", + "LabelChapterName": "Chapter {0}", + "NameSeasonNumber": "Season {0}", + "LabelExit": "Kil\u00e9p\u00e9s", + "LabelVisitCommunity": "K\u00f6z\u00f6ss\u00e9g", + "LabelGithub": "Github", + "LabelApiDocumentation": "Api dokument\u00e1ci\u00f3", + "LabelDeveloperResources": "Fejleszt\u0151i eszk\u00f6z\u00f6k", + "LabelBrowseLibrary": "M\u00e9diat\u00e1r tall\u00f3z\u00e1sa", + "LabelConfigureServer": "Emby konfigur\u00e1l\u00e1sa", + "LabelRestartServer": "Szerver \u00fajraindit\u00e1sa", + "CategorySync": "Sync", + "CategoryUser": "User", + "CategorySystem": "System", + "CategoryApplication": "Application", + "CategoryPlugin": "Plugin", + "NotificationOptionPluginError": "Plugin failure", + "NotificationOptionApplicationUpdateAvailable": "Application update available", + "NotificationOptionApplicationUpdateInstalled": "Application update installed", + "NotificationOptionPluginUpdateInstalled": "Plugin update installed", + "NotificationOptionPluginInstalled": "Plugin installed", + "NotificationOptionPluginUninstalled": "Plugin uninstalled", + "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", + "NotificationOptionNewLibraryContent": "New content added", + "NotificationOptionNewLibraryContentMultiple": "New content added (multiple)", + "NotificationOptionCameraImageUploaded": "Camera image uploaded", + "NotificationOptionUserLockedOut": "User locked out", + "NotificationOptionServerRestartRequired": "Server restart required", + "ViewTypePlaylists": "Playlists", + "ViewTypeMovies": "Movies", + "ViewTypeTvShows": "TV", + "ViewTypeGames": "Games", + "ViewTypeMusic": "Music", + "ViewTypeMusicGenres": "Genres", + "ViewTypeMusicArtists": "Artists", + "ViewTypeBoxSets": "Collections", + "ViewTypeChannels": "Channels", + "ViewTypeLiveTV": "Live TV", + "ViewTypeLiveTvNowPlaying": "Now Airing", + "ViewTypeLatestGames": "Latest Games", + "ViewTypeRecentlyPlayedGames": "Recently Played", + "ViewTypeGameFavorites": "Favorites", + "ViewTypeGameSystems": "Game Systems", + "ViewTypeGameGenres": "Genres", + "ViewTypeTvResume": "Resume", + "ViewTypeTvNextUp": "Next Up", + "ViewTypeTvLatest": "Latest", + "ViewTypeTvShowSeries": "Series", + "ViewTypeTvGenres": "Genres", + "ViewTypeTvFavoriteSeries": "Favorite Series", + "ViewTypeTvFavoriteEpisodes": "Favorite Episodes", + "ViewTypeMovieResume": "Resume", + "ViewTypeMovieLatest": "Latest", + "ViewTypeMovieMovies": "Movies", + "ViewTypeMovieCollections": "Collections", + "ViewTypeMovieFavorites": "Favorites", + "ViewTypeMovieGenres": "Genres", + "ViewTypeMusicLatest": "Latest", + "ViewTypeMusicPlaylists": "Playlists", + "ViewTypeMusicAlbums": "Albums", + "ViewTypeMusicAlbumArtists": "Album Artists", + "HeaderOtherDisplaySettings": "Display Settings", + "ViewTypeMusicSongs": "Songs", + "ViewTypeMusicFavorites": "Favorites", + "ViewTypeMusicFavoriteAlbums": "Favorite Albums", + "ViewTypeMusicFavoriteArtists": "Favorite Artists", + "ViewTypeMusicFavoriteSongs": "Favorite Songs", + "ViewTypeFolders": "Folders", + "ViewTypeLiveTvRecordingGroups": "Recordings", + "ViewTypeLiveTvChannels": "Channels", + "ScheduledTaskFailedWithName": "{0} failed", + "LabelRunningTimeValue": "Running time: {0}", + "ScheduledTaskStartedWithName": "{0} started", + "VersionNumber": "Version {0}", + "PluginInstalledWithName": "{0} was installed", + "PluginUpdatedWithName": "{0} was updated", + "PluginUninstalledWithName": "{0} was uninstalled", + "ItemAddedWithName": "{0} was added to the library", + "ItemRemovedWithName": "{0} was removed from the library", + "LabelIpAddressValue": "Ip address: {0}", + "DeviceOnlineWithName": "{0} is connected", + "UserOnlineFromDevice": "{0} is online from {1}", + "ProviderValue": "Provider: {0}", + "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", + "UserConfigurationUpdatedWithName": "User configuration has been updated for {0}", + "UserCreatedWithName": "User {0} has been created", + "UserPasswordChangedWithName": "Password has been changed for user {0}", + "UserDeletedWithName": "User {0} has been deleted", + "MessageServerConfigurationUpdated": "Server configuration has been updated", + "MessageNamedServerConfigurationUpdatedWithValue": "Server configuration section {0} has been updated", + "MessageApplicationUpdated": "Emby Server has been updated", + "FailedLoginAttemptWithUserName": "Failed login attempt from {0}", + "AuthenticationSucceededWithUserName": "{0} successfully authenticated", + "DeviceOfflineWithName": "{0} has disconnected", + "UserLockedOutWithName": "User {0} has been locked out", + "UserOfflineFromDevice": "{0} has disconnected from {1}", + "UserStartedPlayingItemWithValues": "{0} has started playing {1}", + "UserStoppedPlayingItemWithValues": "{0} has stopped playing {1}", + "SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}", + "HeaderUnidentified": "Unidentified", + "HeaderImagePrimary": "Primary", + "HeaderImageBackdrop": "Backdrop", + "HeaderImageLogo": "Logo", + "HeaderUserPrimaryImage": "User Image", + "HeaderOverview": "Overview", + "HeaderShortOverview": "Short Overview", + "HeaderType": "Type", + "HeaderSeverity": "Severity", + "HeaderUser": "User", + "HeaderName": "Name", + "HeaderDate": "Date", + "HeaderPremiereDate": "Premiere Date", + "HeaderDateAdded": "Date Added", + "HeaderReleaseDate": "Release date", + "HeaderRuntime": "Runtime", + "HeaderPlayCount": "Play Count", + "HeaderSeason": "Season", + "HeaderSeasonNumber": "Season number", + "HeaderSeries": "Series:", + "HeaderNetwork": "Network", + "HeaderYear": "Year:", + "HeaderYears": "Years:", + "HeaderParentalRating": "Parental Rating", + "HeaderCommunityRating": "Community rating", + "HeaderTrailers": "Trailers", + "HeaderSpecials": "Specials", + "HeaderGameSystems": "Game Systems", + "HeaderPlayers": "Players:", + "HeaderAlbumArtists": "Album Artists", + "HeaderAlbums": "Albums", + "HeaderDisc": "Disc", + "HeaderTrack": "Track", + "HeaderAudio": "Audio", + "HeaderVideo": "Video", + "HeaderEmbeddedImage": "Embedded image", + "HeaderResolution": "Resolution", + "HeaderSubtitles": "Subtitles", + "HeaderGenres": "Genres", + "HeaderCountries": "Countries", + "HeaderStatus": "\u00c1llapot", + "HeaderTracks": "Tracks", + "HeaderMusicArtist": "Music artist", + "HeaderLocked": "Locked", + "HeaderStudios": "Studios", + "HeaderActor": "Actors", + "HeaderComposer": "Composers", + "HeaderDirector": "Directors", + "HeaderGuestStar": "Guest star", + "HeaderProducer": "Producers", + "HeaderWriter": "Writers", + "HeaderParentalRatings": "Parental Ratings", + "HeaderCommunityRatings": "Community ratings", + "StartupEmbyServerIsLoading": "Emby Server is loading. Please try again shortly." +} \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/Localization/Core/pl.json b/MediaBrowser.Server.Implementations/Localization/Core/pl.json index 72f4f0dafb..286d39fd59 100644 --- a/MediaBrowser.Server.Implementations/Localization/Core/pl.json +++ b/MediaBrowser.Server.Implementations/Localization/Core/pl.json @@ -150,7 +150,7 @@ "HeaderGameSystems": "Systemy gier", "HeaderPlayers": "Players:", "HeaderAlbumArtists": "Album Artists", - "HeaderAlbums": "Albums", + "HeaderAlbums": "Albumy", "HeaderDisc": "P\u0142yta", "HeaderTrack": "\u015acie\u017cka", "HeaderAudio": "Audio", @@ -161,7 +161,7 @@ "HeaderGenres": "Gatunki", "HeaderCountries": "Kraje", "HeaderStatus": "Status", - "HeaderTracks": "Tracks", + "HeaderTracks": "Utwory", "HeaderMusicArtist": "Wykonawcy muzyczni", "HeaderLocked": "Zablokowane", "HeaderStudios": "Studia", From 049c13cec1cff2764454240674a31da7317452d0 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 12 Dec 2015 10:42:00 -0500 Subject: [PATCH 3/7] update params when stream copying --- .../Playback/BaseStreamingService.cs | 13 ++++++ .../Playback/Hls/DynamicHlsService.cs | 42 +------------------ .../Playback/Progressive/VideoService.cs | 20 +++++++-- 3 files changed, 31 insertions(+), 44 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index a940be7639..64862da601 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -2178,6 +2178,19 @@ namespace MediaBrowser.Api.Playback inputModifier += " " + videoDecoder; } + if (state.VideoRequest != null) + { + var videoCodec = GetVideoEncoder(state); + // See if we can save come cpu cycles by avoiding encoding + if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase)) + { + if (string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase)) + { + inputModifier += " -noaccurate_seek"; + } + } + } + return inputModifier; } diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 3724c88683..c6abffd07c 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -291,25 +291,6 @@ namespace MediaBrowser.Api.Playback.Hls private double[] GetSegmentLengths(StreamState state) { var result = new List(); - if (state.VideoRequest != null) - { - var encoder = GetVideoEncoder(state); - - if (string.Equals(encoder, "copy", StringComparison.OrdinalIgnoreCase)) - { - var videoStream = state.VideoStream; - if (videoStream.KeyFrames != null && videoStream.KeyFrames.Count > 0) - { - foreach (var frame in videoStream.KeyFrames) - { - var seconds = TimeSpan.FromMilliseconds(frame).TotalSeconds; - seconds -= result.Sum(); - result.Add(seconds); - } - return result.ToArray(); - } - } - } var ticks = state.RunTimeTicks ?? 0; @@ -936,27 +917,8 @@ namespace MediaBrowser.Api.Playback.Hls protected override bool CanStreamCopyVideo(VideoStreamRequest request, MediaStream videoStream) { - if (videoStream.KeyFrames == null || videoStream.KeyFrames.Count == 0) - { - Logger.Debug("Cannot stream copy video due to missing keyframe info"); - return false; - } - - var previousSegment = 0; - foreach (var frame in videoStream.KeyFrames) - { - var length = frame - previousSegment; - - // Don't allow really long segments because this could result in long download times - if (length > 10000) - { - Logger.Debug("Cannot stream copy video due to long segment length of {0}ms", length); - return false; - } - previousSegment = frame; - } - - return base.CanStreamCopyVideo(request, videoStream); + return false; + //return base.CanStreamCopyVideo(request, videoStream); } } } \ No newline at end of file diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index d79040dd4c..51bb71bfb8 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -100,6 +100,7 @@ namespace MediaBrowser.Api.Playback.Progressive { // Comparison: https://github.com/jansmolders86/mediacenterjs/blob/master/lib/transcoding/desktop.js format = " -f mp4 -movflags frag_keyframe+empty_moov"; + //format = " -avoid_negative_ts disabled -start_at_zero -copyts -f mp4 -movflags frag_keyframe+empty_moov"; } var threads = GetNumberOfThreads(state, string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase)); @@ -135,11 +136,22 @@ namespace MediaBrowser.Api.Playback.Progressive } // See if we can save come cpu cycles by avoiding encoding - if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase)) { - return state.VideoStream != null && IsH264(state.VideoStream) && string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) ? - args + " -bsf:v h264_mp4toannexb" : - args; + var isOutputMkv = string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase); + + if (isOutputMkv) + { + //args += " -copyts -avoid_negative_ts disabled -start_at_zero"; + } + + if (state.VideoStream != null && IsH264(state.VideoStream) && + (string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) || isOutputMkv)) + { + args += " -bsf:v h264_mp4toannexb"; + } + + return args; } var keyFrameArg = string.Format(" -force_key_frames expr:gte(t,n_forced*{0})", From d341cd39aa293dd6d98554650ad637e1f3603179 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 12 Dec 2015 15:42:39 -0500 Subject: [PATCH 4/7] omit query string from segments on roku --- .../Playback/BaseStreamingService.cs | 9 ++---- .../Playback/Hls/DynamicHlsService.cs | 6 +++- MediaBrowser.Api/Playback/MediaInfoService.cs | 18 ++++++----- .../Playback/Progressive/VideoService.cs | 31 +++++++++---------- 4 files changed, 32 insertions(+), 32 deletions(-) diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 64862da601..fa230473bf 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -2180,14 +2180,9 @@ namespace MediaBrowser.Api.Playback if (state.VideoRequest != null) { - var videoCodec = GetVideoEncoder(state); - // See if we can save come cpu cycles by avoiding encoding - if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase)) + if (string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase)) { - if (string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase)) - { - inputModifier += " -noaccurate_seek"; - } + inputModifier += " -noaccurate_seek"; } } diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index c6abffd07c..95ff8cd0c1 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -513,7 +513,11 @@ namespace MediaBrowser.Api.Playback.Hls // Main stream var playlistUrl = isLiveStream ? "live.m3u8" : "main.m3u8"; - playlistUrl += queryString; + + if ((Request.UserAgent ?? string.Empty).IndexOf("roku", StringComparison.OrdinalIgnoreCase) == -1) + { + playlistUrl += queryString; + } var request = state.Request; diff --git a/MediaBrowser.Api/Playback/MediaInfoService.cs b/MediaBrowser.Api/Playback/MediaInfoService.cs index 2ab2d11f60..5a2c286d5c 100644 --- a/MediaBrowser.Api/Playback/MediaInfoService.cs +++ b/MediaBrowser.Api/Playback/MediaInfoService.cs @@ -318,15 +318,17 @@ namespace MediaBrowser.Api.Playback if (streamInfo != null) { streamInfo.PlaySessionId = playSessionId; - SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token); - } - if (streamInfo != null && streamInfo.PlayMethod == PlayMethod.Transcode) - { - streamInfo.StartPositionTicks = startTimeTicks; - mediaSource.TranscodingUrl = streamInfo.ToUrl("-", auth.Token).TrimStart('-'); - mediaSource.TranscodingContainer = streamInfo.Container; - mediaSource.TranscodingSubProtocol = streamInfo.SubProtocol; + if (streamInfo.PlayMethod == PlayMethod.Transcode) + { + streamInfo.StartPositionTicks = startTimeTicks; + mediaSource.TranscodingUrl = streamInfo.ToUrl("-", auth.Token).TrimStart('-'); + mediaSource.TranscodingContainer = streamInfo.Container; + mediaSource.TranscodingSubProtocol = streamInfo.SubProtocol; + } + + // Do this after the above so that StartPositionTicks is set + SetDeviceSpecificSubtitleInfo(streamInfo, mediaSource, auth.Token); } } } diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index 51bb71bfb8..19e568ec47 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -10,6 +10,7 @@ using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; using ServiceStack; using System; +using System.Globalization; using System.IO; using CommonIO; @@ -100,7 +101,6 @@ namespace MediaBrowser.Api.Playback.Progressive { // Comparison: https://github.com/jansmolders86/mediacenterjs/blob/master/lib/transcoding/desktop.js format = " -f mp4 -movflags frag_keyframe+empty_moov"; - //format = " -avoid_negative_ts disabled -start_at_zero -copyts -f mp4 -movflags frag_keyframe+empty_moov"; } var threads = GetNumberOfThreads(state, string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase)); @@ -124,27 +124,26 @@ namespace MediaBrowser.Api.Playback.Progressive /// Gets video arguments to pass to ffmpeg /// /// The state. - /// The video codec. + /// The video codec. /// System.String. - private string GetVideoArguments(StreamState state, string codec) + private string GetVideoArguments(StreamState state, string videoCodec) { - var args = "-codec:v:0 " + codec; + var args = "-codec:v:0 " + videoCodec; if (state.EnableMpegtsM2TsMode) { args += " -mpegts_m2ts_mode 1"; } - // See if we can save come cpu cycles by avoiding encoding - if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase)) - { - var isOutputMkv = string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase); - - if (isOutputMkv) - { - //args += " -copyts -avoid_negative_ts disabled -start_at_zero"; - } + var isOutputMkv = string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase); + if (state.RunTimeTicks.HasValue) + { + //args += " -copyts -avoid_negative_ts disabled -start_at_zero"; + } + + if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase)) + { if (state.VideoStream != null && IsH264(state.VideoStream) && (string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) || isOutputMkv)) { @@ -164,10 +163,10 @@ namespace MediaBrowser.Api.Playback.Progressive // Add resolution params, if specified if (!hasGraphicalSubs) { - args += GetOutputSizeParam(state, codec); + args += GetOutputSizeParam(state, videoCodec); } - var qualityParam = GetVideoQualityParam(state, codec, false); + var qualityParam = GetVideoQualityParam(state, videoCodec, false); if (!string.IsNullOrEmpty(qualityParam)) { @@ -177,7 +176,7 @@ namespace MediaBrowser.Api.Playback.Progressive // This is for internal graphical subs if (hasGraphicalSubs) { - args += GetGraphicalSubtitleParam(state, codec); + args += GetGraphicalSubtitleParam(state, videoCodec); } return args; From d78e2764d81083be26d0b51873dc689d6d8f0117 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 12 Dec 2015 21:31:37 -0500 Subject: [PATCH 5/7] randomize people task default start time --- .../ScheduledTasks/PeopleValidationTask.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/PeopleValidationTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/PeopleValidationTask.cs index bfa4fe9446..05c3db63c8 100644 --- a/MediaBrowser.Server.Implementations/ScheduledTasks/PeopleValidationTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/PeopleValidationTask.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller; namespace MediaBrowser.Server.Implementations.ScheduledTasks { @@ -17,13 +18,16 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks /// private readonly ILibraryManager _libraryManager; + private readonly IServerApplicationHost _appHost; + /// /// Initializes a new instance of the class. /// /// The library manager. - public PeopleValidationTask(ILibraryManager libraryManager) + public PeopleValidationTask(ILibraryManager libraryManager, IServerApplicationHost appHost) { _libraryManager = libraryManager; + _appHost = appHost; } /// @@ -32,9 +36,12 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks /// IEnumerable{BaseTaskTrigger}. public IEnumerable GetDefaultTriggers() { + // Randomize the default start hour because this operation can really hammer internet metadata providers + var startHour = new Random(_appHost.SystemId.GetHashCode()).Next(0, 8); + return new ITaskTrigger[] { - new DailyTrigger { TimeOfDay = TimeSpan.FromHours(3) }, + new DailyTrigger { TimeOfDay = TimeSpan.FromHours(startHour) }, }; } From 7d36543318909b318bb73086d27fbfc169fc01c1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 12 Dec 2015 23:54:45 -0500 Subject: [PATCH 6/7] adjust fileshare --- MediaBrowser.Api/Images/ImageService.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index 957d73c2d3..7122c8fc12 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -637,7 +637,11 @@ namespace MediaBrowser.Api.Images ResponseHeaders = headers, ContentType = imageResult.Item2, IsHeadRequest = isHeadRequest, - Path = imageResult.Item1 + Path = imageResult.Item1, + + // Sometimes imagemagick keeps a hold on the file briefly even after it's done writing to it. + // I'd rather do this than add a delay after saving the file + FileShare = FileShare.ReadWrite }); } From 1bd9ae86099899af3e095a21d4e62fe0d142704e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 14 Dec 2015 08:54:21 -0500 Subject: [PATCH 7/7] update MediaSourceManager --- .../Library/MediaSourceManager.cs | 36 ++----------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs b/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs index 99096441ed..6bc1af5916 100644 --- a/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs +++ b/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs @@ -68,23 +68,12 @@ namespace MediaBrowser.Server.Implementations.Library if (stream.IsTextSubtitleStream) { - return InternalTextStreamSupportsExternalStream(stream); + return true; } return false; } - private bool InternalTextStreamSupportsExternalStream(MediaStream stream) - { - // These usually have styles and fonts that won't convert to text very well - if (string.Equals(stream.Codec, "ass", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - - return true; - } - public IEnumerable GetMediaStreams(string mediaSourceId) { var list = GetMediaStreams(new MediaStreamQuery @@ -105,11 +94,6 @@ namespace MediaBrowser.Server.Implementations.Library return GetMediaStreamsForItem(list); } - private int GetMaxAllowedBitrateForExternalSubtitleStream() - { - return 30000000; - } - private IEnumerable GetMediaStreamsForItem(IEnumerable streams) { var list = streams.ToList(); @@ -120,25 +104,9 @@ namespace MediaBrowser.Server.Implementations.Library if (subtitleStreams.Count > 0) { - var videoStream = list.FirstOrDefault(i => i.Type == MediaStreamType.Video); - - int maxAllowedBitrateForExternalSubtitleStream = GetMaxAllowedBitrateForExternalSubtitleStream(); - - var videoBitrate = videoStream == null ? maxAllowedBitrateForExternalSubtitleStream : videoStream.BitRate ?? maxAllowedBitrateForExternalSubtitleStream; - foreach (var subStream in subtitleStreams) { - var supportsExternalStream = StreamSupportsExternalStream(subStream); - - if (!subStream.IsExternal) - { - if (supportsExternalStream && videoBitrate >= maxAllowedBitrateForExternalSubtitleStream) - { - supportsExternalStream = false; - } - } - - subStream.SupportsExternalStream = supportsExternalStream; + subStream.SupportsExternalStream = StreamSupportsExternalStream(subStream); } }