mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-11-17 19:08:53 -07:00
commit
ca6cd82a53
@ -288,9 +288,9 @@ namespace MediaBrowser.Api.Playback
|
||||
{
|
||||
if (string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
|
||||
return "h264_qsv";
|
||||
|
||||
|
||||
return "h264_qsv";
|
||||
|
||||
}
|
||||
|
||||
return "libx264";
|
||||
@ -1804,6 +1804,15 @@ namespace MediaBrowser.Api.Playback
|
||||
}
|
||||
}
|
||||
|
||||
if (string.Equals("h264", videoStream.Codec, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
if (videoStream.IsAVC.HasValue && !videoStream.IsAVC.Value)
|
||||
{
|
||||
Logger.Debug("Cannot stream copy video. Stream is marked as not AVC");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Source and target codecs must match
|
||||
if (!string.Equals(request.VideoCodec, videoStream.Codec, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
|
@ -326,15 +326,15 @@ namespace MediaBrowser.Api.Reports
|
||||
}
|
||||
|
||||
// Min official rating
|
||||
if (!string.IsNullOrEmpty(request.MinOfficialRating))
|
||||
if (!string.IsNullOrWhiteSpace(request.MinOfficialRating))
|
||||
{
|
||||
query.MinParentalRating = _localization.GetRatingLevel(request.MinOfficialRating);
|
||||
}
|
||||
|
||||
// Max official rating
|
||||
if (!string.IsNullOrEmpty(request.MaxOfficialRating))
|
||||
if (!string.IsNullOrWhiteSpace(request.MaxOfficialRating))
|
||||
{
|
||||
query.MaxParentalRating = _localization.GetRatingLevel(request.MinOfficialRating);
|
||||
query.MaxParentalRating = _localization.GetRatingLevel(request.MaxOfficialRating);
|
||||
}
|
||||
|
||||
// Artists
|
||||
|
@ -308,15 +308,15 @@ namespace MediaBrowser.Api.UserLibrary
|
||||
}
|
||||
|
||||
// Min official rating
|
||||
if (!string.IsNullOrEmpty(request.MinOfficialRating))
|
||||
if (!string.IsNullOrWhiteSpace(request.MinOfficialRating))
|
||||
{
|
||||
query.MinParentalRating = _localization.GetRatingLevel(request.MinOfficialRating);
|
||||
}
|
||||
|
||||
// Max official rating
|
||||
if (!string.IsNullOrEmpty(request.MaxOfficialRating))
|
||||
if (!string.IsNullOrWhiteSpace(request.MaxOfficialRating))
|
||||
{
|
||||
query.MaxParentalRating = _localization.GetRatingLevel(request.MinOfficialRating);
|
||||
query.MaxParentalRating = _localization.GetRatingLevel(request.MaxOfficialRating);
|
||||
}
|
||||
|
||||
// Artists
|
||||
|
@ -1542,11 +1542,11 @@ namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
if (!string.IsNullOrEmpty(info.Path))
|
||||
{
|
||||
var itemByPath = LibraryManager.FindByPath(info.Path);
|
||||
var itemByPath = LibraryManager.FindByPath(info.Path, null);
|
||||
|
||||
if (itemByPath == null)
|
||||
{
|
||||
Logger.Warn("Unable to find linked item at path {0}", info.Path);
|
||||
//Logger.Warn("Unable to find linked item at path {0}", info.Path);
|
||||
}
|
||||
|
||||
return itemByPath;
|
||||
@ -1555,6 +1555,15 @@ namespace MediaBrowser.Controller.Entities
|
||||
return null;
|
||||
}
|
||||
|
||||
[IgnoreDataMember]
|
||||
public virtual bool EnableRememberingTrackSelections
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a studio to the item
|
||||
/// </summary>
|
||||
|
@ -8,6 +8,7 @@ using System.Runtime.Serialization;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using CommonIO;
|
||||
using MoreLinq;
|
||||
|
||||
namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
@ -97,7 +98,6 @@ namespace MediaBrowser.Controller.Entities
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return base.IsValidFromResolver(newItem);
|
||||
}
|
||||
|
||||
@ -200,9 +200,30 @@ namespace MediaBrowser.Controller.Entities
|
||||
|
||||
public IEnumerable<Folder> GetPhysicalParents()
|
||||
{
|
||||
return LibraryManager.RootFolder.Children
|
||||
var rootChildren = LibraryManager.RootFolder.Children
|
||||
.OfType<Folder>()
|
||||
.Where(i => i.Path != null && PhysicalLocations.Contains(i.Path, StringComparer.OrdinalIgnoreCase));
|
||||
.ToList();
|
||||
|
||||
return PhysicalLocations.Where(i => !string.Equals(i, Path, StringComparison.OrdinalIgnoreCase)).SelectMany(i => GetPhysicalParents(i, rootChildren)).DistinctBy(i => i.Id);
|
||||
}
|
||||
|
||||
private IEnumerable<Folder> GetPhysicalParents(string path, List<Folder> rootChildren)
|
||||
{
|
||||
var result = rootChildren
|
||||
.Where(i => string.Equals(i.Path, path, StringComparison.OrdinalIgnoreCase))
|
||||
.ToList();
|
||||
|
||||
if (result.Count == 0)
|
||||
{
|
||||
var folder = LibraryManager.FindByPath(path, true) as Folder;
|
||||
|
||||
if (folder != null)
|
||||
{
|
||||
result.Add(folder);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
[IgnoreDataMember]
|
||||
|
@ -20,5 +20,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <param name="userData">The user data.</param>
|
||||
/// <param name="user">The user.</param>
|
||||
void FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, User user);
|
||||
|
||||
bool EnableRememberingTrackSelections { get; }
|
||||
}
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ namespace MediaBrowser.Controller.Library
|
||||
/// </summary>
|
||||
/// <param name="path">The path.</param>
|
||||
/// <returns>BaseItem.</returns>
|
||||
BaseItem FindByPath(string path);
|
||||
BaseItem FindByPath(string path, bool? isFolder);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the artist.
|
||||
|
@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Library
|
||||
/// <summary>
|
||||
/// The banner URL
|
||||
/// </summary>
|
||||
public static readonly string BannerUrl = "http://www.thetvdb.com/banners/";
|
||||
public static readonly string BannerUrl = "https://www.thetvdb.com/banners/";
|
||||
|
||||
/// <summary>
|
||||
/// Gets the air days.
|
||||
|
@ -45,6 +45,15 @@ namespace MediaBrowser.Controller.LiveTv
|
||||
set { }
|
||||
}
|
||||
|
||||
[IgnoreDataMember]
|
||||
public override bool EnableRememberingTrackSelections
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the number.
|
||||
/// </summary>
|
||||
|
@ -109,30 +109,31 @@ namespace MediaBrowser.Dlna.Ssdp
|
||||
|
||||
var endPoint = new IPEndPoint(localIp, 1900);
|
||||
|
||||
var socket = GetMulticastSocket(localIp, endPoint);
|
||||
|
||||
var receiveBuffer = new byte[64000];
|
||||
|
||||
CreateNotifier(localIp);
|
||||
|
||||
while (!_tokenSource.IsCancellationRequested)
|
||||
using (var socket = GetMulticastSocket(localIp, endPoint))
|
||||
{
|
||||
var receivedBytes = await socket.ReceiveAsync(receiveBuffer, 0, 64000);
|
||||
var receiveBuffer = new byte[64000];
|
||||
|
||||
if (receivedBytes > 0)
|
||||
CreateNotifier(localIp);
|
||||
|
||||
while (!_tokenSource.IsCancellationRequested)
|
||||
{
|
||||
var args = SsdpHelper.ParseSsdpResponse(receiveBuffer);
|
||||
args.EndPoint = endPoint;
|
||||
args.LocalEndPoint = new IPEndPoint(localIp, 0);
|
||||
var receivedBytes = await socket.ReceiveAsync(receiveBuffer, 0, 64000);
|
||||
|
||||
if (_ssdpHandler.IgnoreMessage(args, true))
|
||||
if (receivedBytes > 0)
|
||||
{
|
||||
return;
|
||||
var args = SsdpHelper.ParseSsdpResponse(receiveBuffer);
|
||||
args.EndPoint = endPoint;
|
||||
args.LocalEndPoint = new IPEndPoint(localIp, 0);
|
||||
|
||||
if (_ssdpHandler.IgnoreMessage(args, true))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_ssdpHandler.LogMessageReceived(args, true);
|
||||
|
||||
TryCreateDevice(args);
|
||||
}
|
||||
|
||||
_ssdpHandler.LogMessageReceived(args, true);
|
||||
|
||||
TryCreateDevice(args);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -575,6 +575,14 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||
return false;
|
||||
}
|
||||
|
||||
if (string.Equals("h264", videoStream.Codec, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
if (videoStream.IsAVC.HasValue && !videoStream.IsAVC.Value)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// If client is requesting a specific video profile, it must match the source
|
||||
if (!string.IsNullOrEmpty(request.Profile))
|
||||
{
|
||||
|
@ -411,6 +411,17 @@ namespace MediaBrowser.MediaEncoding.Probing
|
||||
NalLengthSize = streamInfo.nal_length_size
|
||||
};
|
||||
|
||||
if (string.Equals(streamInfo.is_avc, "true", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(streamInfo.is_avc, "1", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
stream.IsAVC = true;
|
||||
}
|
||||
else if (string.Equals(streamInfo.is_avc, "false", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(streamInfo.is_avc, "0", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
stream.IsAVC = false;
|
||||
}
|
||||
|
||||
// Filter out junk
|
||||
if (!string.IsNullOrWhiteSpace(streamInfo.codec_tag_string) && streamInfo.codec_tag_string.IndexOf("[0]", StringComparison.OrdinalIgnoreCase) == -1)
|
||||
{
|
||||
|
@ -42,6 +42,8 @@ namespace MediaBrowser.Model.Entities
|
||||
/// <value><c>true</c> if this instance is interlaced; otherwise, <c>false</c>.</value>
|
||||
public bool IsInterlaced { get; set; }
|
||||
|
||||
public bool? IsAVC { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the channel layout.
|
||||
/// </summary>
|
||||
|
@ -190,7 +190,7 @@ namespace MediaBrowser.Providers.BoxSets
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (mainResult != null && string.IsNullOrEmpty(mainResult.overview))
|
||||
if (mainResult != null && string.IsNullOrEmpty(mainResult.name))
|
||||
{
|
||||
if (!string.IsNullOrEmpty(language) && !string.Equals(language, "en", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
|
@ -215,6 +215,12 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
|
||||
return;
|
||||
}
|
||||
|
||||
var video = e.Item as Video;
|
||||
if (video != null && video.IsThemeMedia)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var type = GetPlaybackNotificationType(item.MediaType);
|
||||
|
||||
SendPlaybackNotification(type, e);
|
||||
@ -230,6 +236,12 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
|
||||
return;
|
||||
}
|
||||
|
||||
var video = e.Item as Video;
|
||||
if (video != null && video.IsThemeMedia)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var type = GetPlaybackStoppedNotificationType(item.MediaType);
|
||||
|
||||
SendPlaybackNotification(type, e);
|
||||
|
@ -663,7 +663,7 @@ namespace MediaBrowser.Server.Implementations.IO
|
||||
|
||||
while (item == null && !string.IsNullOrEmpty(path))
|
||||
{
|
||||
item = LibraryManager.FindByPath(path);
|
||||
item = LibraryManager.FindByPath(path, null);
|
||||
|
||||
path = Path.GetDirectoryName(path);
|
||||
}
|
||||
|
@ -801,11 +801,12 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
return _userRootFolder;
|
||||
}
|
||||
|
||||
public BaseItem FindByPath(string path)
|
||||
public BaseItem FindByPath(string path, bool? isFolder)
|
||||
{
|
||||
var query = new InternalItemsQuery
|
||||
{
|
||||
Path = path
|
||||
Path = path,
|
||||
IsFolder = isFolder
|
||||
};
|
||||
|
||||
// Only use the database result if there's exactly one item, otherwise we run the risk of returning old data that hasn't been cleaned yet.
|
||||
|
@ -269,13 +269,15 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
{
|
||||
var userData = item == null ? new UserItemData() : _userDataManager.GetUserData(user.Id, item.GetUserDataKey());
|
||||
|
||||
SetDefaultAudioStreamIndex(source, userData, user);
|
||||
SetDefaultSubtitleStreamIndex(source, userData, user);
|
||||
var allowRememberingSelection = item == null || item.EnableRememberingTrackSelections;
|
||||
|
||||
SetDefaultAudioStreamIndex(source, userData, user, allowRememberingSelection);
|
||||
SetDefaultSubtitleStreamIndex(source, userData, user, allowRememberingSelection);
|
||||
}
|
||||
|
||||
private void SetDefaultSubtitleStreamIndex(MediaSourceInfo source, UserItemData userData, User user)
|
||||
private void SetDefaultSubtitleStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection)
|
||||
{
|
||||
if (userData.SubtitleStreamIndex.HasValue && user.Configuration.RememberSubtitleSelections && user.Configuration.SubtitleMode != SubtitlePlaybackMode.None)
|
||||
if (userData.SubtitleStreamIndex.HasValue && user.Configuration.RememberSubtitleSelections && user.Configuration.SubtitleMode != SubtitlePlaybackMode.None && allowRememberingSelection)
|
||||
{
|
||||
var index = userData.SubtitleStreamIndex.Value;
|
||||
// Make sure the saved index is still valid
|
||||
@ -304,9 +306,9 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
user.Configuration.SubtitleMode, audioLangage);
|
||||
}
|
||||
|
||||
private void SetDefaultAudioStreamIndex(MediaSourceInfo source, UserItemData userData, User user)
|
||||
private void SetDefaultAudioStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection)
|
||||
{
|
||||
if (userData.AudioStreamIndex.HasValue && user.Configuration.RememberAudioSelections)
|
||||
if (userData.AudioStreamIndex.HasValue && user.Configuration.RememberAudioSelections && allowRememberingSelection)
|
||||
{
|
||||
var index = userData.AudioStreamIndex.Value;
|
||||
// Make sure the saved index is still valid
|
||||
|
@ -87,13 +87,16 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||
{
|
||||
var searchTerm = query.SearchTerm;
|
||||
|
||||
if (searchTerm != null)
|
||||
{
|
||||
searchTerm = searchTerm.Trim().RemoveDiacritics();
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(searchTerm))
|
||||
{
|
||||
throw new ArgumentNullException("searchTerm");
|
||||
}
|
||||
|
||||
searchTerm = searchTerm.Trim().RemoveDiacritics();
|
||||
|
||||
var terms = GetWords(searchTerm);
|
||||
|
||||
var hints = new List<Tuple<BaseItem, string, int>>();
|
||||
|
@ -1,178 +1,179 @@
|
||||
{
|
||||
"DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.",
|
||||
"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": "Exit",
|
||||
"LabelVisitCommunity": "Visit Community",
|
||||
"LabelGithub": "Github",
|
||||
"LabelApiDocumentation": "Api Documentation",
|
||||
"LabelDeveloperResources": "Developer Resources",
|
||||
"LabelBrowseLibrary": "Browse Library",
|
||||
"LabelConfigureServer": "Configure Emby",
|
||||
"LabelRestartServer": "Restart Server",
|
||||
"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": "Status",
|
||||
"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."
|
||||
"DbUpgradeMessage": "Please wait while your Emby Server database is upgraded. {0}% complete.",
|
||||
"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}",
|
||||
"NameSeasonUnknown": "Season Unknown",
|
||||
"NameSeasonNumber": "Season {0}",
|
||||
"LabelExit": "Exit",
|
||||
"LabelVisitCommunity": "Visit Community",
|
||||
"LabelGithub": "Github",
|
||||
"LabelApiDocumentation": "Api Documentation",
|
||||
"LabelDeveloperResources": "Developer Resources",
|
||||
"LabelBrowseLibrary": "Browse Library",
|
||||
"LabelConfigureServer": "Configure Emby",
|
||||
"LabelRestartServer": "Restart Server",
|
||||
"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": "Status",
|
||||
"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."
|
||||
}
|
@ -26,6 +26,38 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
AddCodecTagColumn();
|
||||
AddCommentColumn();
|
||||
AddNalColumn();
|
||||
AddIsAvcColumn();
|
||||
}
|
||||
|
||||
private void AddIsAvcColumn()
|
||||
{
|
||||
using (var cmd = _connection.CreateCommand())
|
||||
{
|
||||
cmd.CommandText = "PRAGMA table_info(mediastreams)";
|
||||
|
||||
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
if (!reader.IsDBNull(1))
|
||||
{
|
||||
var name = reader.GetString(1);
|
||||
|
||||
if (string.Equals(name, "IsAvc", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var builder = new StringBuilder();
|
||||
|
||||
builder.AppendLine("alter table mediastreams");
|
||||
builder.AppendLine("add column IsAvc BIT NULL");
|
||||
|
||||
_connection.RunQueries(new[] { builder.ToString() }, _logger);
|
||||
}
|
||||
|
||||
private void AddNalColumn()
|
||||
|
@ -124,7 +124,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
_connection = await SqliteExtensions.ConnectToDb(dbFile, Logger).ConfigureAwait(false);
|
||||
|
||||
var createMediaStreamsTableCommand
|
||||
= "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, CodecTag TEXT NULL, Comment TEXT NULL, NalLengthSize TEXT NULL, PRIMARY KEY (ItemId, StreamIndex))";
|
||||
= "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, CodecTag TEXT NULL, Comment TEXT NULL, NalLengthSize TEXT NULL, IsAvc BIT NULL, PRIMARY KEY (ItemId, StreamIndex))";
|
||||
|
||||
string[] queries = {
|
||||
|
||||
@ -391,7 +391,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
"RefFrames",
|
||||
"CodecTag",
|
||||
"Comment",
|
||||
"NalLengthSize"
|
||||
"NalLengthSize",
|
||||
"IsAvc"
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
@ -1574,6 +1575,10 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
{
|
||||
return "RuntimeTicks";
|
||||
}
|
||||
if (string.Equals(name, ItemSortBy.IsFolder, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return "IsFolder";
|
||||
}
|
||||
if (string.Equals(name, ItemSortBy.Random, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return "RANDOM()";
|
||||
@ -2893,6 +2898,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
_saveStreamCommand.GetParameter(index++).Value = stream.CodecTag;
|
||||
_saveStreamCommand.GetParameter(index++).Value = stream.Comment;
|
||||
_saveStreamCommand.GetParameter(index++).Value = stream.NalLengthSize;
|
||||
_saveStreamCommand.GetParameter(index++).Value = stream.IsAVC;
|
||||
|
||||
_saveStreamCommand.Transaction = transaction;
|
||||
_saveStreamCommand.ExecuteNonQuery();
|
||||
@ -3056,6 +3062,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
item.NalLengthSize = reader.GetString(27);
|
||||
}
|
||||
|
||||
if (!reader.IsDBNull(28))
|
||||
{
|
||||
item.IsAVC = reader.GetBoolean(28);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
|
@ -230,12 +230,6 @@
|
||||
<Content Include="dashboard-ui\components\playlisteditor\playlisteditor.js">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="dashboard-ui\components\tvguide\tvguide.js">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="dashboard-ui\components\tvguide\tvguide.template.html">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="dashboard-ui\devices\ie\ie.css">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
@ -1718,6 +1712,9 @@
|
||||
<None Include="dashboard-ui\strings\fr-CA.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="dashboard-ui\strings\fr-FR.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="dashboard-ui\strings\hu.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
@ -662,7 +662,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(val))
|
||||
{
|
||||
val = val.Replace("plugin://plugin.video.youtube/?action=play_video&videoid=", "http://www.youtube.com/watch?v=", StringComparison.OrdinalIgnoreCase);
|
||||
val = val.Replace("plugin://plugin.video.youtube/?action=play_video&videoid=", "https://www.youtube.com/watch?v=", StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
hasTrailer.AddTrailerUrl(val, false);
|
||||
}
|
||||
|
@ -889,7 +889,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
|
||||
{
|
||||
// This is what xbmc expects
|
||||
|
||||
return url.Replace("http://www.youtube.com/watch?v=",
|
||||
return url.Replace("https://www.youtube.com/watch?v=",
|
||||
"plugin://plugin.video.youtube/?action=play_video&videoid=",
|
||||
StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user