make external id's modular

This commit is contained in:
Luke Pulverenti 2014-02-21 13:48:15 -05:00
parent 6e5d90bafe
commit 0d90f1d450
21 changed files with 629 additions and 11 deletions

View file

@ -150,6 +150,7 @@
<Compile Include="Persistence\MediaStreamQuery.cs" />
<Compile Include="Providers\DirectoryService.cs" />
<Compile Include="Providers\ICustomMetadataProvider.cs" />
<Compile Include="Providers\IExternalId.cs" />
<Compile Include="Providers\IForcedProvider.cs" />
<Compile Include="Providers\IHasChangeMonitor.cs" />
<Compile Include="Entities\IHasMetadata.cs" />

View file

@ -0,0 +1,15 @@
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public interface IExternalId
{
string Name { get; }
string Key { get; }
string UrlFormatString { get; }
bool Supports(IHasProviderIds item);
}
}

View file

@ -56,9 +56,11 @@ namespace MediaBrowser.Controller.Providers
/// <param name="metadataProviders">The metadata providers.</param>
/// <param name="savers">The savers.</param>
/// <param name="imageSavers">The image savers.</param>
/// <param name="externalIds">The external ids.</param>
void AddParts(IEnumerable<IImageProvider> imageProviders, IEnumerable<IMetadataService> metadataServices, IEnumerable<IMetadataProvider> metadataProviders,
IEnumerable<IMetadataSaver> savers,
IEnumerable<IImageSaver> imageSavers);
IEnumerable<IImageSaver> imageSavers,
IEnumerable<IExternalId> externalIds);
/// <summary>
/// Gets the available remote images.
@ -82,6 +84,13 @@ namespace MediaBrowser.Controller.Providers
/// <returns>IEnumerable{MetadataPlugin}.</returns>
IEnumerable<MetadataPluginSummary> GetAllMetadataPlugins();
/// <summary>
/// Gets the external urls.
/// </summary>
/// <param name="item">The item.</param>
/// <returns>IEnumerable{ExternalUrl}.</returns>
IEnumerable<ExternalUrl> GetExternalUrls(IHasProviderIds item);
/// <summary>
/// Saves the metadata.
/// </summary>

View file

@ -332,6 +332,9 @@
<Compile Include="..\MediaBrowser.Model\Plugins\PluginInfo.cs">
<Link>Plugins\PluginInfo.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Providers\ExternalIdInfo.cs">
<Link>Providers\ExternalIdInfo.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Providers\ImageProviderInfo.cs">
<Link>Providers\ImageProviderInfo.cs</Link>
</Compile>

View file

@ -319,6 +319,9 @@
<Compile Include="..\MediaBrowser.Model\Plugins\PluginInfo.cs">
<Link>Plugins\PluginInfo.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Providers\ExternalIdInfo.cs">
<Link>Providers\ExternalIdInfo.cs</Link>
</Compile>
<Compile Include="..\MediaBrowser.Model\Providers\ImageProviderInfo.cs">
<Link>Providers\ImageProviderInfo.cs</Link>
</Compile>

View file

@ -1,10 +1,11 @@
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Library;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.Serialization;
using MediaBrowser.Model.Library;
using MediaBrowser.Model.Providers;
namespace MediaBrowser.Model.Dto
{
@ -77,6 +78,12 @@ namespace MediaBrowser.Model.Dto
/// <value>The premiere date.</value>
public DateTime? PremiereDate { get; set; }
/// <summary>
/// Gets or sets the external urls.
/// </summary>
/// <value>The external urls.</value>
public ExternalUrl[] ExternalUrls { get; set; }
/// <summary>
/// Gets or sets the critic rating.
/// </summary>

View file

@ -88,6 +88,7 @@
<Compile Include="LiveTv\TimerInfoDto.cs" />
<Compile Include="Logging\NullLogger.cs" />
<Compile Include="News\NewsItem.cs" />
<Compile Include="Providers\ExternalIdInfo.cs" />
<Compile Include="Providers\ImageProviderInfo.cs" />
<Compile Include="Providers\RemoteImageInfo.cs" />
<Compile Include="Dto\StudioDto.cs" />

View file

@ -0,0 +1,45 @@

namespace MediaBrowser.Model.Providers
{
public class ExternalIdInfo
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get; set; }
/// <summary>
/// Gets or sets the key.
/// </summary>
/// <value>The key.</value>
public string Key { get; set; }
/// <summary>
/// Gets or sets the type of the item.
/// </summary>
/// <value>The type of the item.</value>
public string ItemType { get; set; }
/// <summary>
/// Gets or sets the format string.
/// </summary>
/// <value>The format string.</value>
public string FormatString { get; set; }
}
public class ExternalUrl
{
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
public string Name { get; set; }
/// <summary>
/// Gets or sets the type of the item.
/// </summary>
/// <value>The type of the item.</value>
public string Url { get; set; }
}
}

View file

@ -51,6 +51,11 @@ namespace MediaBrowser.Model.Querying
/// </summary>
DisplayPreferencesId,
/// <summary>
/// The external urls
/// </summary>
ExternalUrls,
/// <summary>
/// Genres
/// </summary>

View file

@ -57,6 +57,8 @@ namespace MediaBrowser.Providers.Manager
private IEnumerable<IMetadataSaver> _savers;
private IImageSaver[] _imageSavers;
private IExternalId[] _externalIds;
/// <summary>
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
/// </summary>
@ -82,8 +84,10 @@ namespace MediaBrowser.Providers.Manager
/// <param name="metadataProviders">The metadata providers.</param>
/// <param name="metadataSavers">The metadata savers.</param>
/// <param name="imageSavers">The image savers.</param>
/// <param name="externalIds">The external ids.</param>
public void AddParts(IEnumerable<IImageProvider> imageProviders, IEnumerable<IMetadataService> metadataServices, IEnumerable<IMetadataProvider> metadataProviders, IEnumerable<IMetadataSaver> metadataSavers,
IEnumerable<IImageSaver> imageSavers)
IEnumerable<IImageSaver> imageSavers,
IEnumerable<IExternalId> externalIds)
{
ImageProviders = imageProviders.ToArray();
@ -91,6 +95,7 @@ namespace MediaBrowser.Providers.Manager
_metadataProviders = metadataProviders.ToArray();
_savers = metadataSavers.ToArray();
_imageSavers = imageSavers.ToArray();
_externalIds = externalIds.OrderBy(i => i.Name).ToArray();
}
public Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken)
@ -625,5 +630,47 @@ namespace MediaBrowser.Providers.Manager
// Nothing found
return new List<RemoteSearchResult>();
}
public IEnumerable<IExternalId> GetExternalIds(IHasProviderIds item)
{
return _externalIds.Where(i =>
{
try
{
return i.Supports(item);
}
catch (Exception ex)
{
_logger.ErrorException("Error in {0}.Suports", ex, i.GetType().Name);
return false;
}
});
}
public IEnumerable<ExternalUrl> GetExternalUrls(IHasProviderIds item)
{
return GetExternalIds(item)
.Select(i =>
{
if (string.IsNullOrEmpty(i.UrlFormatString))
{
return null;
}
var value = item.GetProviderId(i.Key);
if (string.IsNullOrEmpty(value))
{
return null;
}
return new ExternalUrl
{
Name = i.Name,
Url = string.Format(i.UrlFormatString, value)
};
}).Where(i => i != null);
}
}
}

View file

@ -99,6 +99,7 @@
<Compile Include="MediaInfo\FFProbeProvider.cs" />
<Compile Include="MediaInfo\FFProbeVideoInfo.cs" />
<Compile Include="Movies\MovieDbTrailerProvider.cs" />
<Compile Include="Movies\MovieExternalIds.cs" />
<Compile Include="Movies\TrailerMetadataService.cs" />
<Compile Include="Movies\GenericMovieDbInfo.cs" />
<Compile Include="Movies\MovieDbSearch.cs" />
@ -123,11 +124,13 @@
<Compile Include="Music\AudioDbAlbumProvider.cs" />
<Compile Include="Music\AudioDbArtistImageProvider.cs" />
<Compile Include="Music\AudioDbArtistProvider.cs" />
<Compile Include="Music\AudioDbExternalIds.cs" />
<Compile Include="Music\AudioMetadataService.cs" />
<Compile Include="Music\Extensions.cs" />
<Compile Include="Music\LastfmArtistProvider.cs" />
<Compile Include="Music\MovieDbMusicVideoProvider.cs" />
<Compile Include="Music\MusicBrainzArtistProvider.cs" />
<Compile Include="Music\MusicExternalIds.cs" />
<Compile Include="Music\MusicVideoMetadataService.cs" />
<Compile Include="Music\MusicVideoXmlProvider.cs" />
<Compile Include="Omdb\OmdbProvider.cs" />
@ -196,6 +199,7 @@
<Compile Include="TV\SeriesXmlProvider.cs" />
<Compile Include="TV\SeriesXmlParser.cs" />
<Compile Include="TV\TvdbPrescanTask.cs" />
<Compile Include="TV\TvExternalIds.cs" />
<Compile Include="Users\UserMetadataService.cs" />
<Compile Include="Videos\VideoMetadataService.cs" />
<Compile Include="Xbmc\XbmcImageSaver.cs" />

View file

@ -0,0 +1,147 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Providers.Movies
{
public class MovieDbMovieExternalId : IExternalId
{
public string Name
{
get { return "TheMovieDb"; }
}
public string Key
{
get { return MetadataProviders.Tmdb.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.themoviedb.org/movie/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Movie || item is Trailer || item is MusicVideo;
}
}
public class MovieDbSeriesExternalId : IExternalId
{
public string Name
{
get { return "TheMovieDb"; }
}
public string Key
{
get { return MetadataProviders.Tmdb.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.themoviedb.org/tv/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Series;
}
}
public class MovieDbPersonExternalId : IExternalId
{
public string Name
{
get { return "TheMovieDb"; }
}
public string Key
{
get { return MetadataProviders.Tmdb.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.themoviedb.org/person/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Person;
}
}
public class MovieDbCollectionExternalId : IExternalId
{
public string Name
{
get { return "TheMovieDb"; }
}
public string Key
{
get { return MetadataProviders.Tmdb.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.themoviedb.org/collection/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is BoxSet;
}
}
public class ImdbExternalId : IExternalId
{
public string Name
{
get { return "IMDb"; }
}
public string Key
{
get { return MetadataProviders.Imdb.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.imdb.com/title/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return !(item is Person);
}
}
public class ImdbPersonExternalId : IExternalId
{
public string Name
{
get { return "IMDb"; }
}
public string Key
{
get { return MetadataProviders.Imdb.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.imdb.com/name/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Person;
}
}
}

View file

@ -0,0 +1,99 @@
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Providers.Music
{
public class AudioDbAlbumExternalId : IExternalId
{
public string Name
{
get { return "TheAudioDb"; }
}
public string Key
{
get { return MetadataProviders.AudioDbAlbum.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.theaudiodb.com/album/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is MusicAlbum;
}
}
public class AudioDbOtherAlbumExternalId : IExternalId
{
public string Name
{
get { return "TheAudioDb Album"; }
}
public string Key
{
get { return MetadataProviders.AudioDbAlbum.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.theaudiodb.com/album/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Audio;
}
}
public class AudioDbArtistExternalId : IExternalId
{
public string Name
{
get { return "TheAudioDb"; }
}
public string Key
{
get { return MetadataProviders.AudioDbArtist.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.theaudiodb.com/artist/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is MusicArtist;
}
}
public class AudioDbOtherArtistExternalId : IExternalId
{
public string Name
{
get { return "TheAudioDb"; }
}
public string Key
{
get { return MetadataProviders.AudioDbArtist.ToString(); }
}
public string UrlFormatString
{
get { return "http://www.theaudiodb.com/artist/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Audio || item is MusicAlbum;
}
}
}

View file

@ -0,0 +1,121 @@
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Providers.Music
{
public class MusicBrainzReleaseGroupExternalId : IExternalId
{
public string Name
{
get { return "MusicBrainz Release Group"; }
}
public string Key
{
get { return MetadataProviders.MusicBrainzReleaseGroup.ToString(); }
}
public string UrlFormatString
{
get { return "http://musicbrainz.org/release-group/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Audio || item is MusicAlbum || item is MusicArtist;
}
}
public class MusicBrainzAlbumArtistExternalId : IExternalId
{
public string Name
{
get { return "MusicBrainz Album Artist"; }
}
public string Key
{
get { return MetadataProviders.MusicBrainzAlbumArtist.ToString(); }
}
public string UrlFormatString
{
get { return "http://musicbrainz.org/artist/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Audio || item is MusicAlbum;
}
}
public class MusicBrainzAlbumExternalId : IExternalId
{
public string Name
{
get { return "MusicBrainz Album"; }
}
public string Key
{
get { return MetadataProviders.MusicBrainzAlbum.ToString(); }
}
public string UrlFormatString
{
get { return "http://musicbrainz.org/release/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Audio || item is MusicAlbum;
}
}
public class MusicBrainzArtistExternalId : IExternalId
{
public string Name
{
get { return "MusicBrainz"; }
}
public string Key
{
get { return MetadataProviders.MusicBrainzArtist.ToString(); }
}
public string UrlFormatString
{
get { return "http://musicbrainz.org/artist/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is MusicArtist;
}
}
public class MusicBrainzOtherArtistExternalId : IExternalId
{
public string Name
{
get { return "MusicBrainz Artist"; }
}
public string Key
{
get { return MetadataProviders.MusicBrainzArtist.ToString(); }
}
public string UrlFormatString
{
get { return "http://musicbrainz.org/artist/{0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Audio || item is MusicAlbum;
}
}
}

View file

@ -0,0 +1,100 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Providers.TV
{
public class Zap2ItExternalId : IExternalId
{
public string Name
{
get { return "Zap2It"; }
}
public string Key
{
get { return MetadataProviders.Zap2It.ToString(); }
}
public string UrlFormatString
{
get { return "http://tvlistings.zap2it.com/tv/dexter/{0}?aid=zap2it"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Series;
}
}
public class TvdbExternalId : IExternalId
{
public string Name
{
get { return "TheTVDB"; }
}
public string Key
{
get { return MetadataProviders.Tvdb.ToString(); }
}
public string UrlFormatString
{
get { return "http://thetvdb.com/index.php?tab=series&id={0}"; }
}
public bool Supports(IHasProviderIds item)
{
return item is Series;
}
}
public class TvComSeriesExternalId : IExternalId
{
public string Name
{
get { return "TV.com"; }
}
public string Key
{
get { return MetadataProviders.Tvcom.ToString(); }
}
public string UrlFormatString
{
get { return null; }
}
public bool Supports(IHasProviderIds item)
{
return item is Series;
}
}
public class TvComPersonExternalId : IExternalId
{
public string Name
{
get { return "TV.com"; }
}
public string Key
{
get { return MetadataProviders.Tvcom.ToString(); }
}
public string UrlFormatString
{
get { return null; }
}
public bool Supports(IHasProviderIds item)
{
return item is Person;
}
}
}

View file

@ -9,6 +9,7 @@ using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
@ -35,8 +36,9 @@ namespace MediaBrowser.Server.Implementations.Dto
private readonly IImageProcessor _imageProcessor;
private readonly IServerConfigurationManager _config;
private readonly IFileSystem _fileSystem;
private readonly IProviderManager _providerManager;
public DtoService(ILogger logger, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IImageProcessor imageProcessor, IServerConfigurationManager config, IFileSystem fileSystem)
public DtoService(ILogger logger, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataRepository, IItemRepository itemRepo, IImageProcessor imageProcessor, IServerConfigurationManager config, IFileSystem fileSystem, IProviderManager providerManager)
{
_logger = logger;
_libraryManager = libraryManager;
@ -46,6 +48,7 @@ namespace MediaBrowser.Server.Implementations.Dto
_imageProcessor = imageProcessor;
_config = config;
_fileSystem = fileSystem;
_providerManager = providerManager;
}
/// <summary>
@ -689,6 +692,11 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.HomePageUrl = item.HomePageUrl;
}
if (fields.Contains(ItemFields.ExternalUrls))
{
dto.ExternalUrls = _providerManager.GetExternalUrls(item).ToArray();
}
if (fields.Contains(ItemFields.Tags))
{
var hasTags = item as IHasTags;

View file

@ -284,6 +284,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
if (!fileInfo.Exists)
{
_logger.Debug("Creating directory {0}", path);
Directory.CreateDirectory(path);
fileInfo = new DirectoryInfo(path);

View file

@ -423,7 +423,7 @@ namespace MediaBrowser.ServerApplication
ImageProcessor = new ImageProcessor(Logger, ServerConfigurationManager.ApplicationPaths, FileSystemManager, JsonSerializer);
RegisterSingleInstance(ImageProcessor);
DtoService = new DtoService(Logger, LibraryManager, UserManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager);
DtoService = new DtoService(Logger, LibraryManager, UserManager, UserDataManager, ItemRepository, ImageProcessor, ServerConfigurationManager, FileSystemManager, ProviderManager);
RegisterSingleInstance(DtoService);
var newsService = new Server.Implementations.News.NewsService(ApplicationPaths, JsonSerializer);
@ -617,7 +617,8 @@ namespace MediaBrowser.ServerApplication
ProviderManager.AddParts(GetExports<IImageProvider>(), GetExports<IMetadataService>(), GetExports<IMetadataProvider>(),
GetExports<IMetadataSaver>(),
GetExports<IImageSaver>());
GetExports<IImageSaver>(),
GetExports<IExternalId>());
ImageProcessor.AddParts(GetExports<IImageEnhancer>());

View file

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common.Internal</id>
<version>3.0.331</version>
<version>3.0.332</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.331" />
<dependency id="MediaBrowser.Common" version="3.0.332" />
<dependency id="NLog" version="2.1.0" />
<dependency id="SimpleInjector" version="2.4.1" />
<dependency id="sharpcompress" version="0.10.2" />

View file

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

View file

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
<version>3.0.331</version>
<version>3.0.332</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.331" />
<dependency id="MediaBrowser.Common" version="3.0.332" />
</dependencies>
</metadata>
<files>