Browse Source

Merge pull request #2293 from MediaBrowser/dev

Dev
Luke 8 years ago
parent
commit
d8f40438d4

+ 2 - 2
Emby.Common.Implementations/Networking/NetworkManager.cs

@@ -489,7 +489,7 @@ namespace Emby.Common.Implementations.Networking
         /// </summary>
         /// <param name="path">The path.</param>
         /// <returns>IEnumerable{NetworkShare}.</returns>
-        public IEnumerable<NetworkShare> GetNetworkShares(string path)
+        public virtual IEnumerable<NetworkShare> GetNetworkShares(string path)
         {
             return new List<NetworkShare>();
         }
@@ -498,7 +498,7 @@ namespace Emby.Common.Implementations.Networking
         /// Gets available devices within the domain
         /// </summary>
         /// <returns>PC's in the Domain</returns>
-        public IEnumerable<FileSystemEntryInfo> GetNetworkDevices()
+        public virtual IEnumerable<FileSystemEntryInfo> GetNetworkDevices()
         {
             return new List<FileSystemEntryInfo>();
         }

+ 5 - 0
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();

+ 32 - 13
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;
 

+ 10 - 10
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;
 

+ 10 - 12
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;
 

+ 5 - 0
Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs

@@ -992,6 +992,11 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
 
         public async Task<List<MediaSourceInfo>> GetChannelStreamMediaSources(string channelId, CancellationToken cancellationToken)
         {
+            if (string.IsNullOrWhiteSpace(channelId))
+            {
+                throw new ArgumentNullException("channelId");
+            }
+
             foreach (var hostInstance in _liveTvManager.TunerHosts)
             {
                 try

+ 10 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/BaseTunerHost.cs

@@ -101,6 +101,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
 
         public async Task<List<MediaSourceInfo>> 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<LiveStream> GetChannelStream(string channelId, string streamId, CancellationToken cancellationToken)
         {
+            if (string.IsNullOrWhiteSpace(channelId))
+            {
+                throw new ArgumentNullException("channelId");
+            }
+
             if (!IsValidChannelId(channelId))
             {
                 throw new FileNotFoundException();

+ 5 - 0
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);
         }
 

+ 4 - 1
MediaBrowser.Api/Playback/Hls/BaseHlsService.cs

@@ -254,7 +254,10 @@ 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}\"",
+            // 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,
                 GetInputArgument(state),

+ 2 - 2
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;
         }

+ 15 - 11
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<IGrouping<string, Series>> 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<string, Series> 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<string, string>(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);
 

+ 2 - 2
MediaBrowser.ServerApplication/Networking/NetworkManager.cs

@@ -25,7 +25,7 @@ namespace MediaBrowser.ServerApplication.Networking
         /// </summary>
         /// <param name="path">The path.</param>
         /// <returns>IEnumerable{NetworkShare}.</returns>
-        public IEnumerable<NetworkShare> GetNetworkShares(string path)
+        public override IEnumerable<NetworkShare> GetNetworkShares(string path)
         {
             Logger.Info("Getting network shares from {0}", path);
             return new ShareCollection(path).OfType<Share>().Select(ToNetworkShare);
@@ -148,7 +148,7 @@ namespace MediaBrowser.ServerApplication.Networking
         /// Gets available devices within the domain
         /// </summary>
         /// <returns>PC's in the Domain</returns>
-        public IEnumerable<FileSystemEntryInfo> GetNetworkDevices()
+        public override IEnumerable<FileSystemEntryInfo> GetNetworkDevices()
         {
             return GetNetworkDevicesInternal().Select(c => new FileSystemEntryInfo
             {

+ 2 - 0
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;
     }
 }