fixes #697 - Support xbmc offline discs
This commit is contained in:
parent
2db452f68f
commit
6efb78b8b2
|
@ -155,11 +155,11 @@ namespace MediaBrowser.Api
|
|||
|
||||
var games = items.OfType<Game>().ToList();
|
||||
|
||||
summary.ClientInstalledGameCount = games.Count(i => !i.IsInstalledOnClient);
|
||||
summary.ClientInstalledGameCount = games.Count(i => !i.IsPlaceHolder);
|
||||
|
||||
summary.GameCount = games.Count;
|
||||
|
||||
summary.GameFileExtensions = games.Where(i => !i.IsInstalledOnClient).Select(i => Path.GetExtension(i.Path))
|
||||
summary.GameFileExtensions = games.Where(i => !i.IsPlaceHolder).Select(i => Path.GetExtension(i.Path))
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.ToList();
|
||||
|
||||
|
|
|
@ -220,6 +220,12 @@ namespace MediaBrowser.Api.UserLibrary
|
|||
|
||||
[ApiMember(Name = "IsInBoxSet", Description = "Optional filter by items that are in boxsets, or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
|
||||
public bool? IsInBoxSet { get; set; }
|
||||
|
||||
[ApiMember(Name = "IsLocked", Description = "Optional filter by items that are locked.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||
public bool? IsLocked { get; set; }
|
||||
|
||||
[ApiMember(Name = "HasSubtitles", Description = "Optional filter by items that are unidentified by internet metadata providers.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||
public bool? IsUnidentified { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1019,6 +1025,18 @@ namespace MediaBrowser.Api.UserLibrary
|
|||
items = items.Where(i => i.IsPlayed(user) == val);
|
||||
}
|
||||
|
||||
if (request.IsUnidentified.HasValue)
|
||||
{
|
||||
var val = request.IsUnidentified.Value;
|
||||
items = items.Where(i => i.IsUnidentified == val);
|
||||
}
|
||||
|
||||
if (request.IsLocked.HasValue)
|
||||
{
|
||||
var val = request.IsLocked.Value;
|
||||
items = items.Where(i => i.IsLocked == val);
|
||||
}
|
||||
|
||||
if (request.ParentIndexNumber.HasValue)
|
||||
{
|
||||
var filterValue = request.ParentIndexNumber.Value;
|
||||
|
|
|
@ -48,13 +48,13 @@
|
|||
<RunPostBuildEvent>Always</RunPostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="SimpleInjector, Version=2.4.1.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
|
||||
<Reference Include="SimpleInjector, Version=2.5.0.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\SimpleInjector.2.4.1\lib\net45\SimpleInjector.dll</HintPath>
|
||||
<HintPath>..\packages\SimpleInjector.2.5.0\lib\net45\SimpleInjector.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SimpleInjector.Diagnostics, Version=2.4.1.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
|
||||
<Reference Include="SimpleInjector.Diagnostics, Version=2.5.0.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\SimpleInjector.2.4.1\lib\net45\SimpleInjector.Diagnostics.dll</HintPath>
|
||||
<HintPath>..\packages\SimpleInjector.2.5.0\lib\net45\SimpleInjector.Diagnostics.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
|
|
|
@ -2,5 +2,5 @@
|
|||
<packages>
|
||||
<package id="NLog" version="2.1.0" targetFramework="net45" />
|
||||
<package id="sharpcompress" version="0.10.2" targetFramework="net45" />
|
||||
<package id="SimpleInjector" version="2.4.1" targetFramework="net45" />
|
||||
<package id="SimpleInjector" version="2.5.0" targetFramework="net45" />
|
||||
</packages>
|
|
@ -229,19 +229,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
}
|
||||
}
|
||||
|
||||
[IgnoreDataMember]
|
||||
public bool IsUnidentified
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ProviderIds.Any())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public bool IsUnidentified { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the locked fields.
|
||||
|
|
|
@ -352,6 +352,26 @@ namespace MediaBrowser.Controller.Entities
|
|||
return dictionary;
|
||||
}
|
||||
|
||||
private bool IsValidFromResolver(BaseItem current, BaseItem newItem)
|
||||
{
|
||||
var currentAsPlaceHolder = current as ISupportsPlaceHolders;
|
||||
|
||||
if (currentAsPlaceHolder != null)
|
||||
{
|
||||
var newHasPlaceHolder = newItem as ISupportsPlaceHolders;
|
||||
|
||||
if (newHasPlaceHolder != null)
|
||||
{
|
||||
if (currentAsPlaceHolder.IsPlaceHolder != newHasPlaceHolder.IsPlaceHolder)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return current.IsInMixedFolder == newItem.IsInMixedFolder;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validates the children internal.
|
||||
/// </summary>
|
||||
|
@ -401,7 +421,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
{
|
||||
BaseItem currentChild;
|
||||
|
||||
if (currentChildren.TryGetValue(child.Id, out currentChild) && child.IsInMixedFolder == currentChild.IsInMixedFolder)
|
||||
if (currentChildren.TryGetValue(child.Id, out currentChild) && IsValidFromResolver(currentChild, child))
|
||||
{
|
||||
var currentChildLocationType = currentChild.LocationType;
|
||||
if (currentChildLocationType != LocationType.Remote &&
|
||||
|
|
|
@ -7,7 +7,7 @@ using System.Linq;
|
|||
|
||||
namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
public class Game : BaseItem, IHasSoundtracks, IHasTrailers, IHasThemeMedia, IHasTags, IHasScreenshots, IHasPreferredMetadataLanguage, IHasLookupInfo<GameInfo>
|
||||
public class Game : BaseItem, IHasSoundtracks, IHasTrailers, IHasThemeMedia, IHasTags, IHasScreenshots, ISupportsPlaceHolders, IHasPreferredMetadataLanguage, IHasLookupInfo<GameInfo>
|
||||
{
|
||||
public List<Guid> SoundtrackIds { get; set; }
|
||||
|
||||
|
@ -63,10 +63,10 @@ namespace MediaBrowser.Controller.Entities
|
|||
public int? PlayersSupported { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this instance is installed on client.
|
||||
/// Gets a value indicating whether this instance is place holder.
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if this instance is installed on client; otherwise, <c>false</c>.</value>
|
||||
public bool IsInstalledOnClient { get; set; }
|
||||
/// <value><c>true</c> if this instance is place holder; otherwise, <c>false</c>.</value>
|
||||
public bool IsPlaceHolder { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the game system.
|
||||
|
|
|
@ -49,5 +49,11 @@ namespace MediaBrowser.Controller.Entities
|
|||
/// </summary>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
|
||||
bool BeforeMetadataRefresh();
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this instance is unidentified.
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if this instance is unidentified; otherwise, <c>false</c>.</value>
|
||||
bool IsUnidentified { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
12
MediaBrowser.Controller/Entities/ISupportsPlaceHolders.cs
Normal file
12
MediaBrowser.Controller/Entities/ISupportsPlaceHolders.cs
Normal file
|
@ -0,0 +1,12 @@
|
|||
|
||||
namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
public interface ISupportsPlaceHolders
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether this instance is place holder.
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if this instance is place holder; otherwise, <c>false</c>.</value>
|
||||
bool IsPlaceHolder { get; }
|
||||
}
|
||||
}
|
|
@ -16,7 +16,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
/// <summary>
|
||||
/// Class Video
|
||||
/// </summary>
|
||||
public class Video : BaseItem, IHasMediaStreams, IHasAspectRatio, IHasTags
|
||||
public class Video : BaseItem, IHasMediaStreams, IHasAspectRatio, IHasTags, ISupportsPlaceHolders
|
||||
{
|
||||
public bool IsMultiPart { get; set; }
|
||||
|
||||
|
@ -42,6 +42,8 @@ namespace MediaBrowser.Controller.Entities
|
|||
/// <value><c>true</c> if this instance has subtitles; otherwise, <c>false</c>.</value>
|
||||
public bool HasSubtitles { get; set; }
|
||||
|
||||
public bool IsPlaceHolder { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the tags.
|
||||
/// </summary>
|
||||
|
|
|
@ -234,9 +234,12 @@ namespace MediaBrowser.Controller.Library
|
|||
{
|
||||
var fullName = child.FullName;
|
||||
|
||||
if (EntityResolutionHelper.IsVideoFile(fullName) && GetEpisodeNumberFromFile(fullName, false).HasValue)
|
||||
if (EntityResolutionHelper.IsVideoFile(fullName) || EntityResolutionHelper.IsVideoPlaceHolder(fullName))
|
||||
{
|
||||
return true;
|
||||
if (GetEpisodeNumberFromFile(fullName, false).HasValue)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -105,6 +105,7 @@
|
|||
<Compile Include="Entities\ILibraryItem.cs" />
|
||||
<Compile Include="Entities\ImageSourceInfo.cs" />
|
||||
<Compile Include="Entities\IMetadataContainer.cs" />
|
||||
<Compile Include="Entities\ISupportsPlaceHolders.cs" />
|
||||
<Compile Include="Entities\ItemImageInfo.cs" />
|
||||
<Compile Include="Entities\LinkedChild.cs" />
|
||||
<Compile Include="Entities\MusicVideo.cs" />
|
||||
|
|
|
@ -35,7 +35,9 @@ namespace MediaBrowser.Controller.Resolvers
|
|||
// If the path is a file check for a matching extensions
|
||||
if (!args.IsDirectory)
|
||||
{
|
||||
if (EntityResolutionHelper.IsVideoFile(args.Path))
|
||||
var isPlaceHolder = EntityResolutionHelper.IsVideoPlaceHolder(args.Path);
|
||||
|
||||
if (EntityResolutionHelper.IsVideoFile(args.Path) || isPlaceHolder)
|
||||
{
|
||||
var extension = Path.GetExtension(args.Path);
|
||||
|
||||
|
@ -46,7 +48,8 @@ namespace MediaBrowser.Controller.Resolvers
|
|||
{
|
||||
VideoType = type,
|
||||
Path = args.Path,
|
||||
IsInMixedFolder = true
|
||||
IsInMixedFolder = true,
|
||||
IsPlaceHolder = isPlaceHolder
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -139,6 +139,24 @@ namespace MediaBrowser.Controller.Resolvers
|
|||
return VideoFileExtensionsDictionary.ContainsKey(extension);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether [is place holder] [the specified path].
|
||||
/// </summary>
|
||||
/// <param name="path">The path.</param>
|
||||
/// <returns><c>true</c> if [is place holder] [the specified path]; otherwise, <c>false</c>.</returns>
|
||||
/// <exception cref="System.ArgumentNullException">path</exception>
|
||||
public static bool IsVideoPlaceHolder(string path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
throw new ArgumentNullException("path");
|
||||
}
|
||||
|
||||
var extension = Path.GetExtension(path);
|
||||
|
||||
return string.Equals(extension, ".disc", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ensures DateCreated and DateModified have values
|
||||
/// </summary>
|
||||
|
|
|
@ -208,6 +208,12 @@ namespace MediaBrowser.Model.Dto
|
|||
/// <value>The players.</value>
|
||||
public int? Players { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether this instance is place holder.
|
||||
/// </summary>
|
||||
/// <value><c>null</c> if [is place holder] contains no value, <c>true</c> if [is place holder]; otherwise, <c>false</c>.</value>
|
||||
public bool? IsPlaceHolder { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the index number.
|
||||
/// </summary>
|
||||
|
|
|
@ -31,6 +31,8 @@ namespace MediaBrowser.Model.Providers
|
|||
|
||||
public string SearchProviderName { get; set; }
|
||||
|
||||
public string GameSystem { get; set; }
|
||||
|
||||
public RemoteSearchResult()
|
||||
{
|
||||
ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||
|
|
|
@ -1,25 +1,19 @@
|
|||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Providers.Manager;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Providers.Games
|
||||
{
|
||||
public class GameMetadataService : MetadataService<Game, GameInfo>
|
||||
{
|
||||
private readonly ILibraryManager _libraryManager;
|
||||
|
||||
public GameMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem, ILibraryManager libraryManager)
|
||||
public GameMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IProviderRepository providerRepo, IFileSystem fileSystem)
|
||||
: base(serverConfigurationManager, logger, providerManager, providerRepo, fileSystem)
|
||||
{
|
||||
_libraryManager = libraryManager;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -38,6 +32,11 @@ namespace MediaBrowser.Providers.Games
|
|||
{
|
||||
target.GameSystem = source.GameSystem;
|
||||
}
|
||||
|
||||
if (replaceData || !target.PlayersSupported.HasValue)
|
||||
{
|
||||
target.PlayersSupported = source.PlayersSupported;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -386,6 +386,9 @@ namespace MediaBrowser.Providers.Manager
|
|||
{
|
||||
TIdType id = null;
|
||||
|
||||
var unidentifiedCount = 0;
|
||||
var identifiedCount = 0;
|
||||
|
||||
foreach (var provider in providers)
|
||||
{
|
||||
var providerName = provider.GetType().Name;
|
||||
|
@ -410,9 +413,11 @@ namespace MediaBrowser.Providers.Manager
|
|||
|
||||
refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload;
|
||||
|
||||
identifiedCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
unidentifiedCount++;
|
||||
Logger.Debug("{0} returned no metadata for {1}", providerName, item.Path ?? item.Name);
|
||||
}
|
||||
}
|
||||
|
@ -422,11 +427,20 @@ namespace MediaBrowser.Providers.Manager
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
unidentifiedCount++;
|
||||
refreshResult.Status = ProviderRefreshStatus.CompletedWithErrors;
|
||||
refreshResult.ErrorMessage = ex.Message;
|
||||
Logger.ErrorException("Error in {0}", ex, provider.Name);
|
||||
}
|
||||
}
|
||||
|
||||
var isUnidentified = unidentifiedCount > 0 && identifiedCount == 0;
|
||||
|
||||
if (item.IsUnidentified != isUnidentified)
|
||||
{
|
||||
item.IsUnidentified = isUnidentified;
|
||||
refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataImport;
|
||||
}
|
||||
}
|
||||
|
||||
private void MergeNewData(TItemType source, TIdType lookupInfo)
|
||||
|
|
|
@ -126,6 +126,11 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
return _cachedTask;
|
||||
}
|
||||
|
||||
if (item.IsPlaceHolder)
|
||||
{
|
||||
return _cachedTask;
|
||||
}
|
||||
|
||||
var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json, _encodingManager);
|
||||
|
||||
return prober.ProbeVideo(item, directoryService, cancellationToken);
|
||||
|
@ -155,7 +160,7 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
{
|
||||
var video = item as Video;
|
||||
|
||||
if (video != null)
|
||||
if (video != null && !video.IsPlaceHolder)
|
||||
{
|
||||
var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json, _encodingManager);
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||
var video = (Video)item;
|
||||
|
||||
// No support for this
|
||||
if (video.VideoType == VideoType.HdDvd)
|
||||
if (video.VideoType == VideoType.HdDvd || video.IsPlaceHolder)
|
||||
{
|
||||
return Task.FromResult(new DynamicImageResponse { HasImage = false });
|
||||
}
|
||||
|
|
|
@ -970,6 +970,12 @@ namespace MediaBrowser.Server.Implementations.Dto
|
|||
}
|
||||
}
|
||||
|
||||
var supportsPlaceHolders = item as ISupportsPlaceHolders;
|
||||
if (supportsPlaceHolders != null)
|
||||
{
|
||||
dto.IsPlaceHolder = supportsPlaceHolders.IsPlaceHolder;
|
||||
}
|
||||
|
||||
// Add audio info
|
||||
var audio = item as Audio;
|
||||
if (audio != null)
|
||||
|
|
|
@ -451,7 +451,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
|||
}
|
||||
}
|
||||
|
||||
if (options.DeleteFileLocation && (locationType == LocationType.FileSystem || locationType == LocationType.Offline))
|
||||
if (options.DeleteFileLocation && locationType != LocationType.Remote && locationType != LocationType.Virtual)
|
||||
{
|
||||
foreach (var path in item.GetDeletePaths().ToList())
|
||||
{
|
||||
|
|
|
@ -132,6 +132,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Audio
|
|||
return true;
|
||||
}
|
||||
if (EntityResolutionHelper.IsVideoFile(fullName)) return false;
|
||||
if (EntityResolutionHelper.IsVideoPlaceHolder(fullName)) return false;
|
||||
}
|
||||
|
||||
// or a single audio file and no video files
|
||||
|
|
|
@ -84,6 +84,11 @@ namespace MediaBrowser.Server.Implementations.MediaEncoder
|
|||
/// <returns><c>true</c> if [is eligible for chapter image extraction] [the specified video]; otherwise, <c>false</c>.</returns>
|
||||
private bool IsEligibleForChapterImageExtraction(Video video)
|
||||
{
|
||||
if (video.IsPlaceHolder)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (video is Movie)
|
||||
{
|
||||
if (!_config.Configuration.EnableMovieChapterImageExtraction)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Common.Internal</id>
|
||||
<version>3.0.334</version>
|
||||
<version>3.0.335</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.334" />
|
||||
<dependency id="MediaBrowser.Common" version="3.0.335" />
|
||||
<dependency id="NLog" version="2.1.0" />
|
||||
<dependency id="SimpleInjector" version="2.4.1" />
|
||||
<dependency id="sharpcompress" version="0.10.2" />
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Common</id>
|
||||
<version>3.0.334</version>
|
||||
<version>3.0.335</version>
|
||||
<title>MediaBrowser.Common</title>
|
||||
<authors>Media Browser Team</authors>
|
||||
<owners>ebr,Luke,scottisafool</owners>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Server.Core</id>
|
||||
<version>3.0.334</version>
|
||||
<version>3.0.335</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.334" />
|
||||
<dependency id="MediaBrowser.Common" version="3.0.335" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
|
Loading…
Reference in New Issue
Block a user