From ca5afcb0d2f8acb16d3261a2d334e3cc4cb8e809 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 16 Nov 2016 15:52:17 -0500 Subject: [PATCH 1/5] update live tv hls params --- .../Networking/NetworkManager.cs | 4 +-- .../Playback/Hls/BaseHlsService.cs | 2 +- .../Playback/Hls/VideoHlsService.cs | 4 +-- .../TV/MissingEpisodeProvider.cs | 26 +++++++++++-------- .../Networking/NetworkManager.cs | 4 +-- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/Emby.Common.Implementations/Networking/NetworkManager.cs b/Emby.Common.Implementations/Networking/NetworkManager.cs index e336973377..a4f8f7ced0 100644 --- a/Emby.Common.Implementations/Networking/NetworkManager.cs +++ b/Emby.Common.Implementations/Networking/NetworkManager.cs @@ -489,7 +489,7 @@ namespace Emby.Common.Implementations.Networking /// /// The path. /// IEnumerable{NetworkShare}. - public IEnumerable GetNetworkShares(string path) + public virtual IEnumerable GetNetworkShares(string path) { return new List(); } @@ -498,7 +498,7 @@ namespace Emby.Common.Implementations.Networking /// Gets available devices within the domain /// /// PC's in the Domain - public IEnumerable GetNetworkDevices() + public virtual IEnumerable GetNetworkDevices() { return new List(); } diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 0c1cdf53e7..11063ca29f 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -254,7 +254,7 @@ namespace MediaBrowser.Api.Playback.Hls "hls/" + Path.GetFileNameWithoutExtension(outputPath)); } - var args = string.Format("{0} {1} {2} -map_metadata -1 -threads {3} {4} {5} -avoid_negative_ts make_zero -fflags +genpts -sc_threshold 0 {6} -hls_time {7} -start_number {8} -hls_list_size {9}{10} -y \"{11}\"", + var args = string.Format("{0} {1} {2} -map_metadata -1 -threads {3} {4} {5} -sc_threshold 0 {6} -hls_time {7} -start_number {8} -hls_list_size {9}{10} -y \"{11}\"", itsOffset, inputModifier, GetInputArgument(state), diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index 8a2047de4e..67edd3f003 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -89,7 +89,7 @@ namespace MediaBrowser.Api.Playback.Hls { args += " -bsf:v h264_mp4toannexb"; } - args += " -flags +global_header"; + args += " -flags -global_header"; return args; } @@ -112,7 +112,7 @@ namespace MediaBrowser.Api.Playback.Hls args += GetGraphicalSubtitleParam(state, codec); } - args += " -flags +global_header"; + args += " -flags -global_header"; return args; } diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs index c93b6c2fd6..fe56bc752c 100644 --- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs @@ -30,7 +30,7 @@ namespace MediaBrowser.Providers.TV private readonly IFileSystem _fileSystem; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - private static readonly SemaphoreSlim _resourceLock = new SemaphoreSlim(1, 1); + private static readonly SemaphoreSlim ResourceLock = new SemaphoreSlim(1, 1); public static bool IsRunning = false; private readonly IXmlReaderSettingsFactory _xmlSettings; @@ -46,7 +46,7 @@ namespace MediaBrowser.Providers.TV public async Task Run(List> series, bool addNewItems, CancellationToken cancellationToken) { - await _resourceLock.WaitAsync(cancellationToken).ConfigureAwait(false); + await ResourceLock.WaitAsync(cancellationToken).ConfigureAwait(false); IsRunning = true; foreach (var seriesGroup in series) @@ -59,9 +59,10 @@ namespace MediaBrowser.Providers.TV { break; } - catch (IOException) + catch (IOException ex) { //_logger.Warn("Series files missing for series id {0}", seriesGroup.Key); + _logger.ErrorException("Error in missing episode provider for series id {0}", ex, seriesGroup.Key); } catch (Exception ex) { @@ -70,12 +71,15 @@ namespace MediaBrowser.Providers.TV } IsRunning = false; - _resourceLock.Release(); + ResourceLock.Release(); } private async Task Run(IGrouping group, bool addNewItems, CancellationToken cancellationToken) { - var tvdbId = group.Key; + var seriesList = group.ToList(); + var tvdbId = seriesList + .Select(i => i.GetProviderId(MetadataProviders.Tvdb)) + .FirstOrDefault(i => !string.IsNullOrWhiteSpace(i)); // Todo: Support series by imdb id var seriesProviderIds = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -114,30 +118,30 @@ namespace MediaBrowser.Providers.TV .Where(i => i.Item1 != -1 && i.Item2 != -1) .ToList(); - var hasBadData = HasInvalidContent(group); + var hasBadData = HasInvalidContent(seriesList); - var anySeasonsRemoved = await RemoveObsoleteOrMissingSeasons(group, episodeLookup) + var anySeasonsRemoved = await RemoveObsoleteOrMissingSeasons(seriesList, episodeLookup) .ConfigureAwait(false); - var anyEpisodesRemoved = await RemoveObsoleteOrMissingEpisodes(group, episodeLookup) + var anyEpisodesRemoved = await RemoveObsoleteOrMissingEpisodes(seriesList, episodeLookup) .ConfigureAwait(false); var hasNewEpisodes = false; - if (addNewItems && !group.Any(i => !i.IsInternetMetadataEnabled())) + if (addNewItems && seriesList.All(i => i.IsInternetMetadataEnabled())) { var seriesConfig = _config.Configuration.MetadataOptions.FirstOrDefault(i => string.Equals(i.ItemType, typeof(Series).Name, StringComparison.OrdinalIgnoreCase)); if (seriesConfig == null || !seriesConfig.DisabledMetadataFetchers.Contains(TvdbSeriesProvider.Current.Name, StringComparer.OrdinalIgnoreCase)) { - hasNewEpisodes = await AddMissingEpisodes(group.ToList(), hasBadData, seriesDataPath, episodeLookup, cancellationToken) + hasNewEpisodes = await AddMissingEpisodes(seriesList, hasBadData, seriesDataPath, episodeLookup, cancellationToken) .ConfigureAwait(false); } } if (hasNewEpisodes || anySeasonsRemoved || anyEpisodesRemoved) { - foreach (var series in group) + foreach (var series in seriesList) { var directoryService = new DirectoryService(_logger, _fileSystem); diff --git a/MediaBrowser.ServerApplication/Networking/NetworkManager.cs b/MediaBrowser.ServerApplication/Networking/NetworkManager.cs index ed99dcc061..6d3d96e19a 100644 --- a/MediaBrowser.ServerApplication/Networking/NetworkManager.cs +++ b/MediaBrowser.ServerApplication/Networking/NetworkManager.cs @@ -25,7 +25,7 @@ namespace MediaBrowser.ServerApplication.Networking /// /// The path. /// IEnumerable{NetworkShare}. - public IEnumerable GetNetworkShares(string path) + public override IEnumerable GetNetworkShares(string path) { Logger.Info("Getting network shares from {0}", path); return new ShareCollection(path).OfType().Select(ToNetworkShare); @@ -148,7 +148,7 @@ namespace MediaBrowser.ServerApplication.Networking /// Gets available devices within the domain /// /// PC's in the Domain - public IEnumerable GetNetworkDevices() + public override IEnumerable GetNetworkDevices() { return GetNetworkDevicesInternal().Select(c => new FileSystemEntryInfo { From 26978a1f9fd2124b2bcee34dbcea74a11befc7f1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 16 Nov 2016 22:58:27 -0500 Subject: [PATCH 2/5] add ArgumentNullExceptions --- Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs | 5 +++++ .../LiveTv/TunerHosts/BaseTunerHost.cs | 10 ++++++++++ .../LiveTv/TunerHosts/M3UTunerHost.cs | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index aaf74b5c68..81a6b8508c 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -992,6 +992,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV public async Task> GetChannelStreamMediaSources(string channelId, CancellationToken cancellationToken) { + if (string.IsNullOrWhiteSpace(channelId)) + { + throw new ArgumentNullException("channelId"); + } + foreach (var hostInstance in _liveTvManager.TunerHosts) { try diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs index ad43a611b8..5fae3f666b 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs @@ -101,6 +101,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts public async Task> GetChannelStreamMediaSources(string channelId, CancellationToken cancellationToken) { + if (string.IsNullOrWhiteSpace(channelId)) + { + throw new ArgumentNullException("channelId"); + } + if (IsValidChannelId(channelId)) { var hosts = GetTunerHosts(); @@ -161,6 +166,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts public async Task GetChannelStream(string channelId, string streamId, CancellationToken cancellationToken) { + if (string.IsNullOrWhiteSpace(channelId)) + { + throw new ArgumentNullException("channelId"); + } + if (!IsValidChannelId(channelId)) { throw new FileNotFoundException(); diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs index 756c3377c6..19454abbc0 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs @@ -87,6 +87,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts protected override bool IsValidChannelId(string channelId) { + if (string.IsNullOrWhiteSpace(channelId)) + { + throw new ArgumentNullException("channelId"); + } + return channelId.StartsWith(ChannelIdPrefix, StringComparison.OrdinalIgnoreCase); } From 827665390dbe51a15c41f06e294404617377e8f5 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 16 Nov 2016 23:26:21 -0500 Subject: [PATCH 3/5] fix .net core system events --- src/Emby.Server/CoreSystemEvents.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Emby.Server/CoreSystemEvents.cs b/src/Emby.Server/CoreSystemEvents.cs index d83071fa81..7afb94160d 100644 --- a/src/Emby.Server/CoreSystemEvents.cs +++ b/src/Emby.Server/CoreSystemEvents.cs @@ -7,5 +7,7 @@ namespace Emby.Server { public event EventHandler Resume; public event EventHandler Suspend; + public event EventHandler SessionLogoff; + public event EventHandler SystemShutdown; } } From 1adfbfadf16fc7903f9d640c8b1f74b2e05f26a6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 17 Nov 2016 01:54:24 -0500 Subject: [PATCH 4/5] fix ExternalId being lost --- Emby.Server.Core/Data/DataExtensions.cs | 5 +++ Emby.Server.Core/Data/SqliteItemRepository.cs | 45 +++++++++++++------ .../SqliteNotificationsRepository.cs | 20 ++++----- .../Security/AuthenticationRepository.cs | 22 +++++---- 4 files changed, 57 insertions(+), 35 deletions(-) diff --git a/Emby.Server.Core/Data/DataExtensions.cs b/Emby.Server.Core/Data/DataExtensions.cs index 631c1c5005..20766619ee 100644 --- a/Emby.Server.Core/Data/DataExtensions.cs +++ b/Emby.Server.Core/Data/DataExtensions.cs @@ -25,6 +25,11 @@ namespace Emby.Server.Core.Data return (IDataParameter)cmd.Parameters[index]; } + public static IDataParameter GetParameter(this IDbCommand cmd, string name) + { + return (IDataParameter)cmd.Parameters[name]; + } + public static IDataParameter Add(this IDataParameterCollection paramCollection, IDbCommand cmd, string name, DbType type) { var param = cmd.CreateParameter(); diff --git a/Emby.Server.Core/Data/SqliteItemRepository.cs b/Emby.Server.Core/Data/SqliteItemRepository.cs index c2328641c6..91c46222b8 100644 --- a/Emby.Server.Core/Data/SqliteItemRepository.cs +++ b/Emby.Server.Core/Data/SqliteItemRepository.cs @@ -810,7 +810,15 @@ namespace Emby.Server.Core.Data _saveItemCommand.GetParameter(index++).Value = item.ParentId; } - _saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Genres.ToArray()); + if (item.Genres.Count > 0) + { + _saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Genres.ToArray()); + } + else + { + _saveItemCommand.GetParameter(index++).Value = null; + } + _saveItemCommand.GetParameter(index++).Value = item.GetInheritedParentalRatingValue() ?? 0; _saveItemCommand.GetParameter(index++).Value = LatestSchemaVersion; @@ -852,8 +860,23 @@ namespace Emby.Server.Core.Data } _saveItemCommand.GetParameter(index++).Value = item.IsInMixedFolder; - _saveItemCommand.GetParameter(index++).Value = string.Join("|", item.LockedFields.Select(i => i.ToString()).ToArray()); - _saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Studios.ToArray()); + if (item.LockedFields.Count > 0) + { + _saveItemCommand.GetParameter(index++).Value = string.Join("|", item.LockedFields.Select(i => i.ToString()).ToArray()); + } + else + { + _saveItemCommand.GetParameter(index++).Value = null; + } + + if (item.Studios.Count > 0) + { + _saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Studios.ToArray()); + } + else + { + _saveItemCommand.GetParameter(index++).Value = null; + } if (item.Audio.HasValue) { @@ -1043,31 +1066,27 @@ namespace Emby.Server.Core.Data _saveItemCommand.GetParameter(index++).Value = item.TotalBitrate; _saveItemCommand.GetParameter(index++).Value = item.ExtraType; + string artists = null; var hasArtists = item as IHasArtist; if (hasArtists != null) { if (hasArtists.Artists.Count > 0) { - _saveItemCommand.GetParameter(index++).Value = string.Join("|", hasArtists.Artists.ToArray()); - } - else - { - _saveItemCommand.GetParameter(index++).Value = null; + artists = string.Join("|", hasArtists.Artists.ToArray()); } } + _saveItemCommand.GetParameter(index++).Value = artists; + string albumArtists = null; var hasAlbumArtists = item as IHasAlbumArtist; if (hasAlbumArtists != null) { if (hasAlbumArtists.AlbumArtists.Count > 0) { - _saveItemCommand.GetParameter(index++).Value = string.Join("|", hasAlbumArtists.AlbumArtists.ToArray()); - } - else - { - _saveItemCommand.GetParameter(index++).Value = null; + albumArtists = string.Join("|", hasAlbumArtists.AlbumArtists.ToArray()); } } + _saveItemCommand.GetParameter(index++).Value = albumArtists; _saveItemCommand.GetParameter(index++).Value = item.ExternalId; diff --git a/Emby.Server.Core/Notifications/SqliteNotificationsRepository.cs b/Emby.Server.Core/Notifications/SqliteNotificationsRepository.cs index dee0d4cfdd..cd4ac28dcd 100644 --- a/Emby.Server.Core/Notifications/SqliteNotificationsRepository.cs +++ b/Emby.Server.Core/Notifications/SqliteNotificationsRepository.cs @@ -260,16 +260,16 @@ namespace Emby.Server.Core.Notifications { transaction = connection.BeginTransaction(); - replaceNotificationCommand.GetParameter(0).Value = new Guid(notification.Id); - replaceNotificationCommand.GetParameter(1).Value = new Guid(notification.UserId); - replaceNotificationCommand.GetParameter(2).Value = notification.Date.ToUniversalTime(); - replaceNotificationCommand.GetParameter(3).Value = notification.Name; - replaceNotificationCommand.GetParameter(4).Value = notification.Description; - replaceNotificationCommand.GetParameter(5).Value = notification.Url; - replaceNotificationCommand.GetParameter(6).Value = notification.Level.ToString(); - replaceNotificationCommand.GetParameter(7).Value = notification.IsRead; - replaceNotificationCommand.GetParameter(8).Value = string.Empty; - replaceNotificationCommand.GetParameter(9).Value = string.Empty; + replaceNotificationCommand.GetParameter("@Id").Value = new Guid(notification.Id); + replaceNotificationCommand.GetParameter("@UserId").Value = new Guid(notification.UserId); + replaceNotificationCommand.GetParameter("@Date").Value = notification.Date.ToUniversalTime(); + replaceNotificationCommand.GetParameter("@Name").Value = notification.Name; + replaceNotificationCommand.GetParameter("@Description").Value = notification.Description; + replaceNotificationCommand.GetParameter("@Url").Value = notification.Url; + replaceNotificationCommand.GetParameter("@Level").Value = notification.Level.ToString(); + replaceNotificationCommand.GetParameter("@IsRead").Value = notification.IsRead; + replaceNotificationCommand.GetParameter("@Category").Value = string.Empty; + replaceNotificationCommand.GetParameter("@RelatedId").Value = string.Empty; replaceNotificationCommand.Transaction = transaction; diff --git a/Emby.Server.Core/Security/AuthenticationRepository.cs b/Emby.Server.Core/Security/AuthenticationRepository.cs index eaf91c710e..548585375d 100644 --- a/Emby.Server.Core/Security/AuthenticationRepository.cs +++ b/Emby.Server.Core/Security/AuthenticationRepository.cs @@ -80,18 +80,16 @@ namespace Emby.Server.Core.Security { transaction = connection.BeginTransaction(); - var index = 0; - - saveInfoCommand.GetParameter(index++).Value = new Guid(info.Id); - saveInfoCommand.GetParameter(index++).Value = info.AccessToken; - saveInfoCommand.GetParameter(index++).Value = info.DeviceId; - saveInfoCommand.GetParameter(index++).Value = info.AppName; - saveInfoCommand.GetParameter(index++).Value = info.AppVersion; - saveInfoCommand.GetParameter(index++).Value = info.DeviceName; - saveInfoCommand.GetParameter(index++).Value = info.UserId; - saveInfoCommand.GetParameter(index++).Value = info.IsActive; - saveInfoCommand.GetParameter(index++).Value = info.DateCreated; - saveInfoCommand.GetParameter(index++).Value = info.DateRevoked; + saveInfoCommand.GetParameter("@Id").Value = new Guid(info.Id); + saveInfoCommand.GetParameter("@AccessToken").Value = info.AccessToken; + saveInfoCommand.GetParameter("@DeviceId").Value = info.DeviceId; + saveInfoCommand.GetParameter("@AppName").Value = info.AppName; + saveInfoCommand.GetParameter("@AppVersion").Value = info.AppVersion; + saveInfoCommand.GetParameter("@DeviceName").Value = info.DeviceName; + saveInfoCommand.GetParameter("@UserId").Value = info.UserId; + saveInfoCommand.GetParameter("@IsActive").Value = info.IsActive; + saveInfoCommand.GetParameter("@DateCreated").Value = info.DateCreated; + saveInfoCommand.GetParameter("@DateRevoked").Value = info.DateRevoked; saveInfoCommand.Transaction = transaction; From 5bcc419857f9445bc5964d0518c656090b2ae4ee Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 17 Nov 2016 02:05:54 -0500 Subject: [PATCH 5/5] comments --- MediaBrowser.Api/Playback/Hls/BaseHlsService.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 11063ca29f..3b51cbc3af 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -254,6 +254,9 @@ namespace MediaBrowser.Api.Playback.Hls "hls/" + Path.GetFileNameWithoutExtension(outputPath)); } + // add when stream copying? + // -avoid_negative_ts make_zero -fflags +genpts + var args = string.Format("{0} {1} {2} -map_metadata -1 -threads {3} {4} {5} -sc_threshold 0 {6} -hls_time {7} -start_number {8} -hls_list_size {9}{10} -y \"{11}\"", itsOffset, inputModifier,