Pārlūkot izejas kodu

fixes #914 - Add option to save metadata hidden

Luke Pulverenti 10 gadi atpakaļ
vecāks
revīzija
58eb500956
42 mainītis faili ar 511 papildinājumiem un 182 dzēšanām
  1. 24 3
      MediaBrowser.Controller/Entities/UserViewBuilder.cs
  2. 19 0
      MediaBrowser.Dlna/Didl/DidlBuilder.cs
  3. 3 3
      MediaBrowser.Dlna/Ssdp/Datagram.cs
  4. 8 7
      MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs
  5. 7 6
      MediaBrowser.Dlna/Ssdp/SsdpHandler.cs
  6. 2 4
      MediaBrowser.Dlna/Ssdp/SsdpHelper.cs
  7. 1 1
      MediaBrowser.Dlna/Ssdp/SsdpMessageEventArgs.cs
  8. 13 5
      MediaBrowser.LocalMetadata/Savers/AlbumXmlSaver.cs
  9. 13 5
      MediaBrowser.LocalMetadata/Savers/ArtistXmlSaver.cs
  10. 13 5
      MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs
  11. 13 5
      MediaBrowser.LocalMetadata/Savers/ChannelXmlSaver.cs
  12. 10 7
      MediaBrowser.LocalMetadata/Savers/EpisodeXmlSaver.cs
  13. 10 2
      MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs
  14. 12 4
      MediaBrowser.LocalMetadata/Savers/GameSystemXmlSaver.cs
  15. 13 5
      MediaBrowser.LocalMetadata/Savers/GameXmlSaver.cs
  16. 10 7
      MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs
  17. 12 4
      MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs
  18. 10 2
      MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs
  19. 14 6
      MediaBrowser.LocalMetadata/Savers/SeasonXmlSaver.cs
  20. 15 7
      MediaBrowser.LocalMetadata/Savers/SeriesXmlSaver.cs
  21. 10 9
      MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs
  22. 12 9
      MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
  23. 3 0
      MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
  24. 27 0
      MediaBrowser.Model/ApiClient/IApiClient.cs
  25. 6 5
      MediaBrowser.Model/Configuration/ServerConfiguration.cs
  26. 165 0
      MediaBrowser.Model/Dto/StreamOptions.cs
  27. 3 2
      MediaBrowser.Model/Entities/CollectionType.cs
  28. 1 0
      MediaBrowser.Model/MediaBrowser.Model.csproj
  29. 7 1
      MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs
  30. 8 0
      MediaBrowser.Providers/Manager/ImageSaver.cs
  31. 1 2
      MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
  32. 6 8
      MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs
  33. 1 5
      MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
  34. 3 3
      MediaBrowser.Server.Implementations/Connect/ConnectManager.cs
  35. 1 1
      MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs
  36. 1 21
      MediaBrowser.Server.Implementations/Library/LibraryManager.cs
  37. 27 21
      MediaBrowser.Server.Implementations/Localization/Server/server.json
  38. 1 1
      MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
  39. 2 2
      Nuget/MediaBrowser.Common.Internal.nuspec
  40. 1 1
      Nuget/MediaBrowser.Common.nuspec
  41. 1 1
      Nuget/MediaBrowser.Model.Signed.nuspec
  42. 2 2
      Nuget/MediaBrowser.Server.Core.nuspec

+ 24 - 3
MediaBrowser.Controller/Entities/UserViewBuilder.cs

@@ -138,7 +138,7 @@ namespace MediaBrowser.Controller.Entities
                 case CollectionType.GameFavorites:
                     return GetFavoriteGames(parent, user, query);
 
-                case CollectionType.TvSeries:
+                case CollectionType.ViewTypeTvShowSeries:
                     return GetTvSeries(parent, user, query);
 
                 case CollectionType.TvGenres:
@@ -183,6 +183,12 @@ namespace MediaBrowser.Controller.Entities
                 case CollectionType.MusicArtists:
                     return GetMusicArtists(parent, user, query);
 
+                case CollectionType.TvFavoriteEpisodes:
+                    return GetFavoriteEpisodes(parent, user, query);
+
+                case CollectionType.TvFavoriteSeries:
+                    return GetFavoriteSeries(parent, user, query);
+
                 default:
                     return GetResult(GetMediaFolders(user).SelectMany(i => i.GetChildren(user, true)), query);
             }
@@ -302,6 +308,20 @@ namespace MediaBrowser.Controller.Entities
             return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), query);
         }
 
+        private QueryResult<BaseItem> GetFavoriteSeries(Folder parent, User user, UserItemsQuery query)
+        {
+            query.IsFavorite = true;
+
+            return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).Where(i => i is Series), query);
+        }
+
+        private QueryResult<BaseItem> GetFavoriteEpisodes(Folder parent, User user, UserItemsQuery query)
+        {
+            query.IsFavorite = true;
+
+            return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.TvShows, string.Empty }).Where(i => i is Episode), query);
+        }
+
         private QueryResult<BaseItem> GetMovieMovies(Folder parent, User user, UserItemsQuery query)
         {
             return GetResult(GetRecursiveChildren(parent, user, new[] { CollectionType.Movies, CollectionType.BoxSets, string.Empty }).Where(i => i is Movie), query);
@@ -368,8 +388,9 @@ namespace MediaBrowser.Controller.Entities
             list.Add(await GetUserView(category, CollectionType.TvResume, user, "0", parent).ConfigureAwait(false));
             list.Add(await GetUserView(category, CollectionType.TvNextUp, user, "1", parent).ConfigureAwait(false));
             list.Add(await GetUserView(category, CollectionType.TvLatest, user, "2", parent).ConfigureAwait(false));
-            list.Add(await GetUserView(category, CollectionType.TvSeries, user, "3", parent).ConfigureAwait(false));
-            //list.Add(await GetUserView(CollectionType.TvFavorites, user, "4", parent).ConfigureAwait(false));
+            list.Add(await GetUserView(category, CollectionType.ViewTypeTvShowSeries, user, "3", parent).ConfigureAwait(false));
+            list.Add(await GetUserView(category, CollectionType.TvFavoriteSeries, user, "4", parent).ConfigureAwait(false));
+            list.Add(await GetUserView(category, CollectionType.TvFavoriteEpisodes, user, "5", parent).ConfigureAwait(false));
             //list.Add(await GetUserView(CollectionType.TvGenres, user, "5", parent).ConfigureAwait(false));
 
             return GetResult(list, query);

+ 19 - 0
MediaBrowser.Dlna/Didl/DidlBuilder.cs

@@ -503,6 +503,9 @@ namespace MediaBrowser.Dlna.Didl
 
         private XmlElement CreateObjectClass(XmlDocument result, BaseItem item)
         {
+            // More types here
+            // http://oss.linn.co.uk/repos/Public/LibUpnpCil/DidlLite/UpnpAv/Test/TestDidlLite.cs
+
             var objectClass = result.CreateElement("upnp", "class", NS_UPNP);
 
             if (item.IsFolder)
@@ -527,6 +530,10 @@ namespace MediaBrowser.Dlna.Didl
                     {
                         classType = "object.container.playlistContainer";
                     }
+                    else if (item is PhotoAlbum)
+                    {
+                        classType = "object.container.album.photoAlbum";
+                    }
                 }
 
                 objectClass.InnerText = classType ?? "object.container.storageFolder";
@@ -545,11 +552,23 @@ namespace MediaBrowser.Dlna.Didl
                 {
                     objectClass.InnerText = "object.item.videoItem.movie";
                 }
+                else if (!_profile.RequiresPlainVideoItems && item is MusicVideo)
+                {
+                    objectClass.InnerText = "object.item.videoItem.musicVideoClip";
+                }
                 else
                 {
                     objectClass.InnerText = "object.item.videoItem";
                 }
             }
+            else if (item is MusicGenre)
+            {
+                objectClass.InnerText = _profile.RequiresPlainFolders ? "object.container.storageFolder" : "object.container.genre.musicGenre";
+            }
+            else if (item is Genre || item is GameGenre)
+            {
+                objectClass.InnerText = _profile.RequiresPlainFolders ? "object.container.storageFolder" : "object.container.genre";
+            }
             else
             {
                 objectClass.InnerText = "object.item";

+ 3 - 3
MediaBrowser.Dlna/Ssdp/Datagram.cs

@@ -8,8 +8,8 @@ namespace MediaBrowser.Dlna.Ssdp
 {
     public class Datagram
     {
-        public IPEndPoint ToEndPoint { get; private set; }
-        public IPEndPoint FromEndPoint { get; private set; }
+        public EndPoint ToEndPoint { get; private set; }
+        public EndPoint FromEndPoint { get; private set; }
         public string Message { get; private set; }
 
         /// <summary>
@@ -24,7 +24,7 @@ namespace MediaBrowser.Dlna.Ssdp
 
         private readonly ILogger _logger;
 
-        public Datagram(IPEndPoint toEndPoint, IPEndPoint fromEndPoint, ILogger logger, string message, int totalSendCount)
+        public Datagram(EndPoint toEndPoint, EndPoint fromEndPoint, ILogger logger, string message, int totalSendCount)
         {
             Message = message;
             _logger = logger;

+ 8 - 7
MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs

@@ -87,13 +87,13 @@ namespace MediaBrowser.Dlna.Ssdp
 
             try
             {
-                //var ip = _networkManager.GetLocalIpAddresses().FirstOrDefault();
+                var ip = _networkManager.GetLocalIpAddresses().FirstOrDefault();
 
-                //if (ip != null)
-                //{
-                //    e.LocalIp = IPAddress.Parse(ip);
-                //    TryCreateDevice(e);
-                //}
+                if (ip != null)
+                {
+                    e.LocalIp = IPAddress.Parse(ip);
+                    TryCreateDevice(e);
+                }
             }
             catch (OperationCanceledException)
             {
@@ -140,7 +140,8 @@ namespace MediaBrowser.Dlna.Ssdp
 
                         if (receivedBytes > 0)
                         {
-                            var args = SsdpHelper.ParseSsdpResponse(receiveBuffer, endPoint);
+                            var args = SsdpHelper.ParseSsdpResponse(receiveBuffer);
+                            args.EndPoint = endPoint;
                             args.LocalIp = localIp;
 
                             TryCreateDevice(args);

+ 7 - 6
MediaBrowser.Dlna/Ssdp/SsdpHandler.cs

@@ -101,7 +101,7 @@ namespace MediaBrowser.Dlna.Ssdp
             ReloadAliveNotifier();
         }
 
-        public void SendSearchMessage(IPEndPoint localIp)
+        public void SendSearchMessage(EndPoint localIp)
         {
             var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
 
@@ -121,7 +121,7 @@ namespace MediaBrowser.Dlna.Ssdp
 
         public void SendDatagram(string header,
             Dictionary<string, string> values,
-            IPEndPoint localAddress,
+            EndPoint localAddress,
             int sendCount = 1)
         {
             SendDatagram(header, values, _ssdpEndp, localAddress, sendCount);
@@ -129,8 +129,8 @@ namespace MediaBrowser.Dlna.Ssdp
 
         public void SendDatagram(string header,
             Dictionary<string, string> values,
-            IPEndPoint endpoint,
-            IPEndPoint localAddress,
+            EndPoint endpoint,
+            EndPoint localAddress,
             int sendCount = 1)
         {
             var msg = new SsdpMessageBuilder().BuildMessage(header, values);
@@ -147,7 +147,7 @@ namespace MediaBrowser.Dlna.Ssdp
             StartQueueTimer();
         }
 
-        private void RespondToSearch(IPEndPoint endpoint, string deviceType)
+        private void RespondToSearch(EndPoint endpoint, string deviceType)
         {
             if (_config.GetDlnaConfiguration().EnableDebugLogging)
             {
@@ -267,7 +267,8 @@ namespace MediaBrowser.Dlna.Ssdp
                     _logger.Debug(Encoding.ASCII.GetString(received));
                 }
 
-                var args = SsdpHelper.ParseSsdpResponse(received, (IPEndPoint)endpoint);
+                var args = SsdpHelper.ParseSsdpResponse(received);
+                args.EndPoint = endpoint;
 
                 if (_config.GetDlnaConfiguration().EnableDebugLogging)
                 {

+ 2 - 4
MediaBrowser.Dlna/Ssdp/SsdpHelper.cs

@@ -1,14 +1,13 @@
 using System;
 using System.Collections.Generic;
 using System.IO;
-using System.Net;
 using System.Text;
 
 namespace MediaBrowser.Dlna.Ssdp
 {
     public class SsdpHelper
     {
-        public static SsdpMessageEventArgs ParseSsdpResponse(byte[] data, IPEndPoint endpoint)
+        public static SsdpMessageEventArgs ParseSsdpResponse(byte[] data)
         {
             using (var ms = new MemoryStream(data))
             {
@@ -35,8 +34,7 @@ namespace MediaBrowser.Dlna.Ssdp
                     return new SsdpMessageEventArgs
                     {
                         Method = method,
-                        Headers = headers,
-                        EndPoint = endpoint
+                        Headers = headers
                     };
                 }
             }

+ 1 - 1
MediaBrowser.Dlna/Ssdp/SsdpMessageEventArgs.cs

@@ -8,7 +8,7 @@ namespace MediaBrowser.Dlna.Ssdp
     {
         public string Method { get; set; }
 
-        public IPEndPoint EndPoint { get; set; }
+        public EndPoint EndPoint { get; set; }
 
         public Dictionary<string, string> Headers { get; set; }
 

+ 13 - 5
MediaBrowser.LocalMetadata/Savers/AlbumXmlSaver.cs

@@ -1,10 +1,11 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Threading;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Threading;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -18,6 +19,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public AlbumXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -52,7 +60,7 @@ namespace MediaBrowser.LocalMetadata.Savers
 
             var xmlFilePath = GetSavePath(item);
 
-            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { });
+            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { }, _config);
         }
 
         /// <summary>

+ 13 - 5
MediaBrowser.LocalMetadata/Savers/ArtistXmlSaver.cs

@@ -1,10 +1,11 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Threading;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Threading;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -18,6 +19,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public ArtistXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -52,7 +60,7 @@ namespace MediaBrowser.LocalMetadata.Savers
 
             var xmlFilePath = GetSavePath(item);
 
-            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { });
+            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { }, _config);
         }
 
         /// <summary>

+ 13 - 5
MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs

@@ -1,10 +1,11 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Threading;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Library;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Threading;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -18,6 +19,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public BoxSetXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -52,7 +60,7 @@ namespace MediaBrowser.LocalMetadata.Savers
 
             var xmlFilePath = GetSavePath(item);
 
-            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { });
+            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { }, _config);
         }
 
         /// <summary>

+ 13 - 5
MediaBrowser.LocalMetadata/Savers/ChannelXmlSaver.cs

@@ -1,10 +1,11 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Threading;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Threading;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -13,6 +14,13 @@ namespace MediaBrowser.LocalMetadata.Savers
     /// </summary>
     public class ChannelXmlSaver : IMetadataFileSaver
     {
+        private readonly IServerConfigurationManager _config;
+
+        public ChannelXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -57,7 +65,7 @@ namespace MediaBrowser.LocalMetadata.Savers
 
             XmlSaverHelpers.Save(builder, xmlFilePath, new List<string>
             {
-            });
+            }, _config);
         }
 
         /// <summary>

+ 10 - 7
MediaBrowser.LocalMetadata/Savers/EpisodeXmlSaver.cs

@@ -1,13 +1,14 @@
-using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Persistence;
+using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
 using System.Security;
 using System.Text;
 using System.Threading;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Persistence;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -16,10 +17,12 @@ namespace MediaBrowser.LocalMetadata.Savers
         private readonly IItemRepository _itemRepository;
 
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+        private readonly IServerConfigurationManager _config;
 
-        public EpisodeXmlSaver(IItemRepository itemRepository)
+        public EpisodeXmlSaver(IItemRepository itemRepository, IServerConfigurationManager config)
         {
             _itemRepository = itemRepository;
+            _config = config;
         }
 
         /// <summary>
@@ -133,7 +136,7 @@ namespace MediaBrowser.LocalMetadata.Savers
                     "DVD_episodenumber",
                     "DVD_season",
                     "absolute_number"
-                });
+                }, _config);
         }
 
         /// <summary>

+ 10 - 2
MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
@@ -21,6 +22,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public FolderXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -66,7 +74,7 @@ namespace MediaBrowser.LocalMetadata.Savers
 
             var xmlFilePath = GetSavePath(item);
 
-            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { });
+            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { }, _config);
         }
 
         /// <summary>

+ 12 - 4
MediaBrowser.LocalMetadata/Savers/GameSystemXmlSaver.cs

@@ -1,10 +1,11 @@
-using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using System.Collections.Generic;
 using System.IO;
 using System.Security;
 using System.Text;
 using System.Threading;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -18,6 +19,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public GameSystemXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -59,7 +67,7 @@ namespace MediaBrowser.LocalMetadata.Savers
 
             var xmlFilePath = GetSavePath(item);
 
-            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { });
+            XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> { }, _config);
         }
 
         /// <summary>

+ 13 - 5
MediaBrowser.LocalMetadata/Savers/GameXmlSaver.cs

@@ -1,12 +1,13 @@
-using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Model.Entities;
+using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
 using System.Security;
 using System.Text;
 using System.Threading;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -23,6 +24,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public GameXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+        
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -91,7 +99,7 @@ namespace MediaBrowser.LocalMetadata.Savers
                     "GameSystem",
                     "NesBox",
                     "NesBoxRom"
-                });
+                }, _config);
         }
 
         public string GetSavePath(IHasMetadata item)

+ 10 - 7
MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs

@@ -1,13 +1,14 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Security;
-using System.Text;
-using System.Threading;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Persistence;
+using System.Collections.Generic;
+using System.IO;
+using System.Security;
+using System.Text;
+using System.Threading;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -17,10 +18,12 @@ namespace MediaBrowser.LocalMetadata.Savers
     public class MovieXmlSaver : IMetadataFileSaver
     {
         private readonly IItemRepository _itemRepository;
+        private readonly IServerConfigurationManager _config;
 
-        public MovieXmlSaver(IItemRepository itemRepository)
+        public MovieXmlSaver(IItemRepository itemRepository, IServerConfigurationManager config)
         {
             _itemRepository = itemRepository;
+            _config = config;
         }
 
         public string Name
@@ -112,7 +115,7 @@ namespace MediaBrowser.LocalMetadata.Savers
                     "Artist",
                     "Album",
                     "TmdbCollectionName"
-                });
+                }, _config);
         }
 
         public string GetSavePath(IHasMetadata item)

+ 12 - 4
MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs

@@ -1,10 +1,11 @@
-using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using System.Collections.Generic;
 using System.IO;
 using System.Security;
 using System.Text;
 using System.Threading;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -21,6 +22,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public PersonXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -65,7 +73,7 @@ namespace MediaBrowser.LocalMetadata.Savers
             XmlSaverHelpers.Save(builder, xmlFilePath, new List<string>
                 {
                     "PlaceOfBirth"
-                });
+                }, _config);
         }
 
         /// <summary>

+ 10 - 2
MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs

@@ -1,9 +1,10 @@
-using System.Security;
+using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Playlists;
 using System.Collections.Generic;
 using System.IO;
+using System.Security;
 using System.Text;
 using System.Threading;
 
@@ -19,6 +20,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public PlaylistXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -70,7 +78,7 @@ namespace MediaBrowser.LocalMetadata.Savers
                 "OwnerUserId",
                 "PlaylistMediaType"
 
-            });
+            }, _config);
         }
 
         /// <summary>

+ 14 - 6
MediaBrowser.LocalMetadata/Savers/SeasonXmlSaver.cs

@@ -1,12 +1,13 @@
-using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Library;
+using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
 using System.Security;
 using System.Text;
 using System.Threading;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Library;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -20,6 +21,13 @@ namespace MediaBrowser.LocalMetadata.Savers
             }
         }
 
+        private readonly IServerConfigurationManager _config;
+
+        public SeasonXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+        
         /// <summary>
         /// Determines whether [is enabled for] [the specified item].
         /// </summary>
@@ -42,7 +50,7 @@ namespace MediaBrowser.LocalMetadata.Savers
         }
 
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
-        
+
         /// <summary>
         /// Saves the specified item.
         /// </summary>
@@ -71,7 +79,7 @@ namespace MediaBrowser.LocalMetadata.Savers
             XmlSaverHelpers.Save(builder, xmlFilePath, new List<string>
             {
                 "SeasonNumber"
-            });
+            }, _config);
         }
 
         /// <summary>

+ 15 - 7
MediaBrowser.LocalMetadata/Savers/SeriesXmlSaver.cs

@@ -1,18 +1,26 @@
-using System.Collections.Generic;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Model.Entities;
+using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
 using System.Security;
 using System.Text;
 using System.Threading;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
     public class SeriesXmlSaver : IMetadataFileSaver
     {
+        private readonly IServerConfigurationManager _config;
+
+        public SeriesXmlSaver(IServerConfigurationManager config)
+        {
+            _config = config;
+        }
+        
         public string Name
         {
             get
@@ -38,7 +46,7 @@ namespace MediaBrowser.LocalMetadata.Savers
         }
 
         private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
-        
+
         /// <summary>
         /// Saves the specified item.
         /// </summary>
@@ -119,7 +127,7 @@ namespace MediaBrowser.LocalMetadata.Savers
 
                     // Deprecated. No longer saving in this field.
                     "AnimeSeriesIndex"
-                });
+                }, _config);
         }
 
         /// <summary>

+ 10 - 9
MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs

@@ -1,4 +1,11 @@
-using System;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Controller.Playlists;
+using MediaBrowser.Model.Entities;
+using System;
 using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
@@ -6,12 +13,6 @@ using System.Linq;
 using System.Security;
 using System.Text;
 using System.Xml;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Persistence;
-using MediaBrowser.Controller.Playlists;
-using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.LocalMetadata.Savers
 {
@@ -126,7 +127,7 @@ namespace MediaBrowser.LocalMetadata.Savers
         /// <param name="xml">The XML.</param>
         /// <param name="path">The path.</param>
         /// <param name="xmlTagsUsed">The XML tags used.</param>
-        public static void Save(StringBuilder xml, string path, List<string> xmlTagsUsed)
+        public static void Save(StringBuilder xml, string path, List<string> xmlTagsUsed, IServerConfigurationManager config)
         {
             if (File.Exists(path))
             {
@@ -165,7 +166,7 @@ namespace MediaBrowser.LocalMetadata.Savers
                 }
             }
 
-            if (wasHidden)
+            if (wasHidden || config.Configuration.SaveMetadataHidden)
             {
                 file.Refresh();
 

+ 12 - 9
MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs

@@ -59,7 +59,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             try
             {
                 // Return the original without any conversions, if possible
-                if (startTimeTicks == 0 && 
+                if (startTimeTicks == 0 &&
                     !endTimeTicks.HasValue &&
                     string.Equals(inputFormat, outputFormat, StringComparison.OrdinalIgnoreCase))
                 {
@@ -158,14 +158,14 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 
             var fileInfo = await GetReadableFile(mediaSource.Path, inputFiles, mediaSource.Protocol, subtitleStream, cancellationToken).ConfigureAwait(false);
 
-            var stream = await GetSubtitleStream(fileInfo.Item1, subtitleStream.Language).ConfigureAwait(false);
+            var stream = await GetSubtitleStream(fileInfo.Item1, subtitleStream.Language, fileInfo.Item3).ConfigureAwait(false);
 
             return new Tuple<Stream, string>(stream, fileInfo.Item2);
         }
 
-        private async Task<Stream> GetSubtitleStream(string path, string language)
+        private async Task<Stream> GetSubtitleStream(string path, string language, bool requiresCharset)
         {
-            if (!string.IsNullOrEmpty(language))
+            if (requiresCharset && !string.IsNullOrEmpty(language))
             {
                 var charset = GetSubtitleFileCharacterSet(path, language);
 
@@ -188,7 +188,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
             return File.OpenRead(path);
         }
 
-        private async Task<Tuple<string, string>> GetReadableFile(string mediaPath,
+        private async Task<Tuple<string, string, bool>> GetReadableFile(string mediaPath,
             string[] inputFiles,
             MediaProtocol protocol,
             MediaStream subtitleStream,
@@ -225,7 +225,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                 await ExtractTextSubtitle(inputFiles, protocol, subtitleStream.Index, outputCodec, outputPath, cancellationToken)
                         .ConfigureAwait(false);
 
-                return new Tuple<string, string>(outputPath, outputFormat);
+                return new Tuple<string, string, bool>(outputPath, outputFormat, false);
             }
 
             var currentFormat = (Path.GetExtension(subtitleStream.Path) ?? subtitleStream.Codec)
@@ -239,10 +239,10 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                 await ConvertTextSubtitleToSrt(subtitleStream.Path, outputPath, subtitleStream.Language, cancellationToken)
                         .ConfigureAwait(false);
 
-                return new Tuple<string, string>(outputPath, "srt");
+                return new Tuple<string, string, bool>(outputPath, "srt", false);
             }
 
-            return new Tuple<string, string>(subtitleStream.Path, currentFormat);
+            return new Tuple<string, string, bool>(subtitleStream.Path, currentFormat, false);
         }
 
         private async Task<SubtitleTrackInfo> GetTrackInfo(Stream stream,
@@ -647,7 +647,10 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                 _logger.Info(msg);
             }
 
-            await SetAssFont(outputPath).ConfigureAwait(false);
+            if (string.Equals(outputCodec, "ass", StringComparison.OrdinalIgnoreCase))
+            {
+                await SetAssFont(outputPath).ConfigureAwait(false);
+            }
         }
 
         /// <summary>

+ 3 - 0
MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj

@@ -341,6 +341,9 @@
     <Compile Include="..\MediaBrowser.Model\Dto\RecommendationType.cs">
       <Link>Dto\RecommendationType.cs</Link>
     </Compile>
+    <Compile Include="..\MediaBrowser.Model\Dto\StreamOptions.cs">
+      <Link>Dto\StreamOptions.cs</Link>
+    </Compile>
     <Compile Include="..\MediaBrowser.Model\Dto\StudioDto.cs">
       <Link>Dto\StudioDto.cs</Link>
     </Compile>

+ 27 - 0
MediaBrowser.Model/ApiClient/IApiClient.cs

@@ -1265,5 +1265,32 @@ namespace MediaBrowser.Model.ApiClient
         /// <param name="query">The query.</param>
         /// <returns>Task&lt;QueryResult&lt;BaseItemDto&gt;&gt;.</returns>
         Task<QueryResult<BaseItemDto>> GetPlaylistItems(PlaylistItemQuery query);
+
+        /// <summary>
+        /// Gets the url needed to stream an audio file
+        /// </summary>
+        /// <param name="options">The options.</param>
+        /// <returns>System.String.</returns>
+        /// <exception cref="ArgumentNullException">options</exception>
+        [Obsolete]
+        string GetAudioStreamUrl(StreamOptions options);
+
+        /// <summary>
+        /// Gets the url needed to stream a video file
+        /// </summary>
+        /// <param name="options">The options.</param>
+        /// <returns>System.String.</returns>
+        /// <exception cref="ArgumentNullException">options</exception>
+        [Obsolete]
+        string GetVideoStreamUrl(VideoStreamOptions options);
+
+        /// <summary>
+        /// Formulates a url for streaming video using the HLS protocol
+        /// </summary>
+        /// <param name="options">The options.</param>
+        /// <returns>System.String.</returns>
+        /// <exception cref="ArgumentNullException">options</exception>
+        [Obsolete]
+        string GetHlsVideoStreamUrl(VideoStreamOptions options);
     }
 }

+ 6 - 5
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -160,7 +160,6 @@ namespace MediaBrowser.Model.Configuration
         public bool EnableAutomaticRestart { get; set; }
 
         public TvFileOrganizationOptions TvFileOrganizationOptions { get; set; }
-        public LiveTvOptions LiveTvOptions { get; set; }
 
         public bool EnableRealtimeMonitor { get; set; }
         public PathSubstitution[] PathSubstitutions { get; set; }
@@ -178,7 +177,9 @@ namespace MediaBrowser.Model.Configuration
 
         public PeopleMetadataOptions PeopleMetadataOptions { get; set; }
 
-        public string[] SecureApps { get; set; }
+        public string[] SecureApps1 { get; set; }
+
+        public bool SaveMetadataHidden { get; set; }
 
         /// <summary>
         /// Initializes a new instance of the <see cref="ServerConfiguration" /> class.
@@ -205,7 +206,7 @@ namespace MediaBrowser.Model.Configuration
 
             RealtimeMonitorDelay = 30;
 
-            EnableInternetProviders = true; //initial installs will need these
+            EnableInternetProviders = true; 
 
             PathSubstitutions = new PathSubstitution[] { };
 
@@ -224,14 +225,14 @@ namespace MediaBrowser.Model.Configuration
 
             PeopleMetadataOptions = new PeopleMetadataOptions();
 
-            SecureApps = new[]
+            SecureApps1 = new[]
             {
                 "Dashboard",
-                "Chrome Companion",
                 "MBKinect",
                 "NuVue",
                 "Media Browser Theater",
 
+                //"Chrome Companion",
                 //"MB-Classic"
             };
 

+ 165 - 0
MediaBrowser.Model/Dto/StreamOptions.cs

@@ -0,0 +1,165 @@
+using System;
+
+namespace MediaBrowser.Model.Dto
+{
+    /// <summary>
+    /// Class StreamOptions
+    /// </summary>
+    [Obsolete]
+    public class StreamOptions
+    {
+        /// <summary>
+        /// Gets or sets the audio bit rate.
+        /// </summary>
+        /// <value>The audio bit rate.</value>
+        public int? AudioBitRate { get; set; }
+
+        /// <summary>
+        /// Gets or sets the audio codec.
+        /// Omit to copy the original stream
+        /// </summary>
+        /// <value>The audio encoding format.</value>
+        public string AudioCodec { get; set; }
+
+        /// <summary>
+        /// Gets or sets the item id.
+        /// </summary>
+        /// <value>The item id.</value>
+        public string ItemId { get; set; }
+
+        /// <summary>
+        /// Gets or sets the max audio channels.
+        /// </summary>
+        /// <value>The max audio channels.</value>
+        public int? MaxAudioChannels { get; set; }
+
+        /// <summary>
+        /// Gets or sets the max audio sample rate.
+        /// </summary>
+        /// <value>The max audio sample rate.</value>
+        public int? MaxAudioSampleRate { get; set; }
+
+        /// <summary>
+        /// Gets or sets the start time ticks.
+        /// </summary>
+        /// <value>The start time ticks.</value>
+        public long? StartTimeTicks { get; set; }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether the original media should be served statically
+        /// Only used with progressive streaming
+        /// </summary>
+        /// <value><c>true</c> if static; otherwise, <c>false</c>.</value>
+        public bool? Static { get; set; }
+
+        /// <summary>
+        /// Gets or sets the output file extension.
+        /// </summary>
+        /// <value>The output file extension.</value>
+        public string OutputFileExtension { get; set; }
+
+        /// <summary>
+        /// Gets or sets the device id.
+        /// </summary>
+        /// <value>The device id.</value>
+        public string DeviceId { get; set; }
+    }
+    
+    /// <summary>
+    /// Class VideoStreamOptions
+    /// </summary>
+    [Obsolete]
+    public class VideoStreamOptions : StreamOptions
+    {
+        /// <summary>
+        /// Gets or sets the video codec.
+        /// Omit to copy
+        /// </summary>
+        /// <value>The video codec.</value>
+        public string VideoCodec { get; set; }
+
+        /// <summary>
+        /// Gets or sets the video bit rate.
+        /// </summary>
+        /// <value>The video bit rate.</value>
+        public int? VideoBitRate { get; set; }
+
+        /// <summary>
+        /// Gets or sets the width.
+        /// </summary>
+        /// <value>The width.</value>
+        public int? Width { get; set; }
+
+        /// <summary>
+        /// Gets or sets the height.
+        /// </summary>
+        /// <value>The height.</value>
+        public int? Height { get; set; }
+
+        /// <summary>
+        /// Gets or sets the width of the max.
+        /// </summary>
+        /// <value>The width of the max.</value>
+        public int? MaxWidth { get; set; }
+
+        /// <summary>
+        /// Gets or sets the height of the max.
+        /// </summary>
+        /// <value>The height of the max.</value>
+        public int? MaxHeight { get; set; }
+
+        /// <summary>
+        /// Gets or sets the frame rate.
+        /// </summary>
+        /// <value>The frame rate.</value>
+        public double? FrameRate { get; set; }
+
+        /// <summary>
+        /// Gets or sets the index of the audio stream.
+        /// </summary>
+        /// <value>The index of the audio stream.</value>
+        public int? AudioStreamIndex { get; set; }
+
+        /// <summary>
+        /// Gets or sets the index of the video stream.
+        /// </summary>
+        /// <value>The index of the video stream.</value>
+        public int? VideoStreamIndex { get; set; }
+
+        /// <summary>
+        /// Gets or sets the index of the subtitle stream.
+        /// </summary>
+        /// <value>The index of the subtitle stream.</value>
+        public int? SubtitleStreamIndex { get; set; }
+
+        /// <summary>
+        /// Gets or sets the profile.
+        /// </summary>
+        /// <value>The profile.</value>
+        public string Profile { get; set; }
+
+        /// <summary>
+        /// Gets or sets the level.
+        /// </summary>
+        /// <value>The level.</value>
+        public string Level { get; set; }
+
+        /// <summary>
+        /// Gets or sets the baseline stream audio bit rate.
+        /// </summary>
+        /// <value>The baseline stream audio bit rate.</value>
+        public int? BaselineStreamAudioBitRate { get; set; }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether [append baseline stream].
+        /// </summary>
+        /// <value><c>true</c> if [append baseline stream]; otherwise, <c>false</c>.</value>
+        public bool AppendBaselineStream { get; set; }
+
+        /// <summary>
+        /// Gets or sets the time stamp offset ms. Only used with HLS.
+        /// </summary>
+        /// <value>The time stamp offset ms.</value>
+        public int? TimeStampOffsetMs { get; set; }
+    }
+}

+ 3 - 2
MediaBrowser.Model/Entities/CollectionType.cs

@@ -30,12 +30,13 @@
         public const string LiveTvChannels = "LiveTvChannels";
         public const string LiveTvRecordingGroups = "LiveTvRecordingGroups";
 
-        public const string TvSeries = "TvSeries";
+        public const string ViewTypeTvShowSeries = "ViewTypeTvShowSeries";
         public const string TvGenres = "TvGenres";
         public const string TvLatest = "TvLatest";
         public const string TvNextUp = "TvNextUp";
         public const string TvResume = "TvResume";
-        public const string TvFavorites = "TvFavorites";
+        public const string TvFavoriteSeries = "TvFavoriteSeries";
+        public const string TvFavoriteEpisodes = "TvFavoriteEpisodes";
 
         public const string MovieLatest = "MovieLatest";
         public const string MovieResume = "MovieResume";

+ 1 - 0
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -82,6 +82,7 @@
     <Compile Include="Configuration\XbmcMetadataOptions.cs" />
     <Compile Include="Configuration\SubtitlePlaybackMode.cs" />
     <Compile Include="Drawing\ImageOrientation.cs" />
+    <Compile Include="Dto\StreamOptions.cs" />
     <Compile Include="FileOrganization\AutoOrganizeOptions.cs" />
     <Compile Include="FileOrganization\TvFileOrganizationOptions.cs" />
     <Compile Include="Configuration\BaseApplicationConfiguration.cs" />

+ 7 - 1
MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs

@@ -7,12 +7,13 @@ using MediaBrowser.Model.Providers;
 using MediaBrowser.Providers.Genres;
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.FolderImages
 {
-    public class DefaultImageProvider : IRemoteImageProvider
+    public class DefaultImageProvider : IRemoteImageProvider, IHasChangeMonitor
     {
         private readonly IHttpClient _httpClient;
 
@@ -130,5 +131,10 @@ namespace MediaBrowser.Providers.FolderImages
                 ResourcePool = GenreImageProvider.ImageDownloadResourcePool
             });
         }
+
+        public bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date)
+        {
+            return GetSupportedImages(item).Any(i => !item.HasImage(i));
+        }
     }
 }

+ 8 - 0
MediaBrowser.Providers/Manager/ImageSaver.cs

@@ -216,6 +216,14 @@ namespace MediaBrowser.Providers.Manager
                 {
                     await source.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, cancellationToken).ConfigureAwait(false);
                 }
+
+                if (_config.Configuration.SaveMetadataHidden)
+                {
+                    file.Refresh();
+
+                    // Add back the attribute
+                    file.Attributes |= FileAttributes.Hidden;
+                }
             }
             finally
             {

+ 1 - 2
MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs

@@ -501,8 +501,7 @@ namespace MediaBrowser.Providers.MediaInfo
                 var downloadedLanguages = await new SubtitleDownloader(_logger,
                     _subtitleManager)
                     .DownloadSubtitles(video,
-                    currentStreams,
-                    externalSubtitleStreams,
+                    currentStreams.Concat(externalSubtitleStreams).ToList(),
                     subtitleOptions.SkipIfGraphicalSubtitlesPresent,
                     subtitleOptions.SkipIfAudioTrackMatches,
                     subtitleOptions.DownloadLanguages,

+ 6 - 8
MediaBrowser.Providers/MediaInfo/SubtitleDownloader.cs

@@ -25,8 +25,7 @@ namespace MediaBrowser.Providers.MediaInfo
         }
 
         public async Task<List<string>> DownloadSubtitles(Video video,
-            List<MediaStream> internalMediaStreams,
-            List<MediaStream> externalSubtitleStreams,
+            List<MediaStream> mediaStreams,
             bool skipIfGraphicalSubtitlesPresent,
             bool skipIfAudioTrackMatches,
             IEnumerable<string> languages,
@@ -60,7 +59,7 @@ namespace MediaBrowser.Providers.MediaInfo
             {
                 try
                 {
-                    var downloaded = await DownloadSubtitles(video, internalMediaStreams, externalSubtitleStreams, skipIfGraphicalSubtitlesPresent, skipIfAudioTrackMatches, lang, mediaType, cancellationToken)
+                    var downloaded = await DownloadSubtitles(video, mediaStreams, skipIfGraphicalSubtitlesPresent, skipIfAudioTrackMatches, lang, mediaType, cancellationToken)
                         .ConfigureAwait(false);
 
                     if (downloaded)
@@ -78,8 +77,7 @@ namespace MediaBrowser.Providers.MediaInfo
         }
 
         private async Task<bool> DownloadSubtitles(Video video,
-            List<MediaStream> internalMediaStreams,
-            IEnumerable<MediaStream> externalSubtitleStreams,
+            List<MediaStream> mediaStreams,
             bool skipIfGraphicalSubtitlesPresent,
             bool skipIfAudioTrackMatches,
             string language,
@@ -87,12 +85,12 @@ namespace MediaBrowser.Providers.MediaInfo
             CancellationToken cancellationToken)
         {
             // There's already subtitles for this language
-            if (externalSubtitleStreams.Any(i => string.Equals(i.Language, language, StringComparison.OrdinalIgnoreCase)))
+            if (mediaStreams.Any(i => i.Type == MediaStreamType.Subtitle && i.IsTextSubtitleStream && string.Equals(i.Language, language, StringComparison.OrdinalIgnoreCase)))
             {
                 return false;
             }
 
-            var audioStreams = internalMediaStreams.Where(i => i.Type == MediaStreamType.Audio).ToList();
+            var audioStreams = mediaStreams.Where(i => i.Type == MediaStreamType.Audio).ToList();
             var defaultAudioStreams = audioStreams.Where(i => i.IsDefault).ToList();
 
             // If none are marked as default, just take a guess
@@ -110,7 +108,7 @@ namespace MediaBrowser.Providers.MediaInfo
 
             // There's an internal subtitle stream for this language
             if (skipIfGraphicalSubtitlesPresent &&
-                internalMediaStreams.Any(i => i.Type == MediaStreamType.Subtitle && !i.IsTextSubtitleStream && string.Equals(i.Language, language, StringComparison.OrdinalIgnoreCase)))
+                mediaStreams.Any(i => i.Type == MediaStreamType.Subtitle && !i.IsTextSubtitleStream && string.Equals(i.Language, language, StringComparison.OrdinalIgnoreCase)))
             {
                 return false;
             }

+ 1 - 5
MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs

@@ -105,14 +105,10 @@ namespace MediaBrowser.Providers.MediaInfo
             {
                 var mediaStreams = video.GetMediaSources(false).First().MediaStreams;
 
-                var externalSubtitleStreams = mediaStreams.Where(i => i.Type == MediaStreamType.Subtitle && i.IsExternal).ToList();
-                var currentStreams = mediaStreams.Except(externalSubtitleStreams).ToList();
-
                 var downloadedLanguages = await new SubtitleDownloader(_logger,
                     _subtitleManager)
                     .DownloadSubtitles(video,
-                    currentStreams,
-                    externalSubtitleStreams,
+                    mediaStreams,
                     options.SkipIfGraphicalSubtitlesPresent,
                     options.SkipIfAudioTrackMatches,
                     options.DownloadLanguages,

+ 3 - 3
MediaBrowser.Server.Implementations/Connect/ConnectManager.cs

@@ -1,5 +1,4 @@
-using System.Net;
-using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
@@ -12,6 +11,7 @@ using System;
 using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
+using System.Net;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
@@ -77,7 +77,7 @@ namespace MediaBrowser.Server.Implementations.Connect
         {
             WanIpAddress = address;
 
-            UpdateConnectInfo();
+            //UpdateConnectInfo();
         }
 
         private async void UpdateConnectInfo()

+ 1 - 1
MediaBrowser.Server.Implementations/HttpServer/Security/AuthService.cs

@@ -59,7 +59,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.Security
             var auth = AuthorizationContext.GetAuthorizationInfo(req);
 
             if (!string.IsNullOrWhiteSpace(auth.Token)
-                || _config.Configuration.SecureApps.Contains(auth.Client ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+                || _config.Configuration.SecureApps1.Contains(auth.Client ?? string.Empty, StringComparer.OrdinalIgnoreCase))
             {
                 if (!allowLocal || !req.IsLocal)
                 {

+ 1 - 21
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -861,13 +861,7 @@ namespace MediaBrowser.Server.Implementations.Library
 
             if (!fileInfo.Exists)
             {
-                Directory.CreateDirectory(path);
-                fileInfo = new DirectoryInfo(path);
-
-                if (!fileInfo.Exists)
-                {
-                    throw new IOException("Path not created: " + path);
-                }
+                fileInfo = Directory.CreateDirectory(path);
 
                 isNew = true;
             }
@@ -1470,20 +1464,6 @@ namespace MediaBrowser.Server.Implementations.Library
             return collectionTypes.Count == 1 ? collectionTypes[0] : null;
         }
 
-
-        public IEnumerable<string> GetAllArtists()
-        {
-            return GetAllArtists(RootFolder.RecursiveChildren);
-        }
-
-        public IEnumerable<string> GetAllArtists(IEnumerable<BaseItem> items)
-        {
-            return items
-                .OfType<Audio>()
-                .SelectMany(i => i.AllArtists)
-                .Distinct(StringComparer.OrdinalIgnoreCase);
-        }
-
         public Task<UserView> GetNamedView(string name, string type, string sortName, CancellationToken cancellationToken)
         {
             return GetNamedView(name, null, type, sortName, cancellationToken);

+ 27 - 21
MediaBrowser.Server.Implementations/Localization/Server/server.json

@@ -842,26 +842,27 @@
     "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",
-    "ViewTypeTvSeries":  "Series",
-    "ViewTypeTvGenres":  "Genres",
-    "ViewTypeTvFavorites":  "Favorites",
-    "ViewTypeMovieResume":  "Resume",
-    "ViewTypeMovieLatest":  "Latest",
-    "ViewTypeMovieMovies":  "Movies",
-    "ViewTypeMovieCollections":  "Collections",
-    "ViewTypeMovieFavorites":  "Favorites",
-    "ViewTypeMovieGenres":  "Genres",
-    "ViewTypeMusicLatest":  "Latest",
-    "ViewTypeMusicAlbums":  "Albums",
-    "ViewTypeMusicAlbumArtists":  "Album Artists",
+    "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",
+    "ViewTypeMusicAlbums": "Albums",
+    "ViewTypeMusicAlbumArtists": "Album Artists",
     "HeaderOtherDisplaySettings": "Display Settings",
     "HeaderMyViews": "My Views",
     "LabelSelectFolderGroups": "Automatically group content from the following folders into views such as Movies, Music and TV:",
@@ -1143,5 +1144,10 @@
     "HeaderDeveloperInfo": "Developer Info",
     "HeaderRevisionHistory": "Revision History",
     "ButtonViewWebsite": "View website",
-    "LabelRecurringDonationCanBeCancelledHelp":  "Recurring donations can be cancelled at any time from within your PayPal account."
+    "LabelRecurringDonationCanBeCancelledHelp": "Recurring donations can be cancelled at any time from within your PayPal account.",
+    "HeaderXmlSettings": "Xml Settings",
+    "HeaderXmlDocumentAttributes": "Xml Document Attributes",
+    "HeaderXmlDocumentAttribute": "Xml Document Attribute",
+    "XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every xml response.",
+    "OptionSaveMetadataAsHidden": "Save metadata and images as hidden files"
 }

+ 1 - 1
MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs

@@ -189,7 +189,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
                 stream.CopyTo(filestream);
             }
 
-            if (wasHidden)
+            if (wasHidden || ConfigurationManager.Configuration.SaveMetadataHidden)
             {
                 file.Refresh();
 

+ 2 - 2
Nuget/MediaBrowser.Common.Internal.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
-        <version>3.0.430</version>
+        <version>3.0.431</version>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.430" />
+            <dependency id="MediaBrowser.Common" version="3.0.431" />
             <dependency id="NLog" version="3.1.0.0" />
             <dependency id="SimpleInjector" version="2.5.2" />
             <dependency id="sharpcompress" version="0.10.2" />

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.430</version>
+        <version>3.0.431</version>
         <title>MediaBrowser.Common</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 1 - 1
Nuget/MediaBrowser.Model.Signed.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Model.Signed</id>
-        <version>3.0.430</version>
+        <version>3.0.431</version>
         <title>MediaBrowser.Model - Signed Edition</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 2 - 2
Nuget/MediaBrowser.Server.Core.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.430</version>
+        <version>3.0.431</version>
         <title>Media Browser.Server.Core</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.430" />
+            <dependency id="MediaBrowser.Common" version="3.0.431" />
         </dependencies>
     </metadata>
     <files>