switch to generic lookup type

This commit is contained in:
Luke Pulverenti 2014-02-06 22:10:13 -05:00
parent 57c92fa948
commit b1713a16cd
74 changed files with 458 additions and 202 deletions

View file

@ -1,4 +1,5 @@
using MediaBrowser.Model.Configuration; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities.Audio
/// <summary> /// <summary>
/// Class Audio /// Class Audio
/// </summary> /// </summary>
public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<SongInfo>
{ {
public Audio() public Audio()
{ {
@ -127,5 +128,16 @@ namespace MediaBrowser.Controller.Entities.Audio
{ {
return config.BlockUnratedMusic; return config.BlockUnratedMusic;
} }
public SongInfo GetLookupInfo()
{
var info = GetItemLookupInfo<SongInfo>();
info.AlbumArtist = AlbumArtist;
info.Album = Album;
info.Artists = Artists;
return info;
}
} }
} }

View file

@ -1,4 +1,5 @@
using MediaBrowser.Model.Configuration; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -10,7 +11,7 @@ namespace MediaBrowser.Controller.Entities.Audio
/// <summary> /// <summary>
/// Class MusicAlbum /// Class MusicAlbum
/// </summary> /// </summary>
public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasTags public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasTags, IHasLookupInfo<AlbumInfo>
{ {
public List<Guid> SoundtrackIds { get; set; } public List<Guid> SoundtrackIds { get; set; }
@ -112,6 +113,26 @@ namespace MediaBrowser.Controller.Entities.Audio
{ {
return config.BlockUnratedMusic; return config.BlockUnratedMusic;
} }
public AlbumInfo GetLookupInfo()
{
var id = GetItemLookupInfo<AlbumInfo>();
id.AlbumArtist = AlbumArtist;
var artist = Parents.OfType<MusicArtist>().FirstOrDefault();
if (artist != null)
{
id.ArtistProviderIds = artist.ProviderIds;
}
id.SongInfos = RecursiveChildren.OfType<Audio>()
.Select(i => i.GetLookupInfo())
.ToList();
return id;
}
} }
public class MusicAlbumDisc : Folder public class MusicAlbumDisc : Folder

View file

@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.Audio
/// <summary> /// <summary>
/// Class MusicArtist /// Class MusicArtist
/// </summary> /// </summary>
public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasTags, IHasProductionLocations public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasTags, IHasProductionLocations, IHasLookupInfo<ArtistInfo>
{ {
[IgnoreDataMember] [IgnoreDataMember]
public List<ItemByNameCounts> UserItemCountList { get; set; } public List<ItemByNameCounts> UserItemCountList { get; set; }
@ -201,5 +201,16 @@ namespace MediaBrowser.Controller.Entities.Audio
progress.Report(100); progress.Report(100);
} }
public ArtistInfo GetLookupInfo()
{
var info = GetItemLookupInfo<ArtistInfo>();
info.SongInfos = RecursiveChildren.OfType<Audio>()
.Select(i => i.GetLookupInfo())
.ToList();
return info;
}
} }
} }

View file

@ -21,7 +21,7 @@ namespace MediaBrowser.Controller.Entities
/// <summary> /// <summary>
/// Class BaseItem /// Class BaseItem
/// </summary> /// </summary>
public abstract class BaseItem : IHasProviderIds, ILibraryItem, IHasImages, IHasUserData, IHasMetadata public abstract class BaseItem : IHasProviderIds, ILibraryItem, IHasImages, IHasUserData, IHasMetadata, IHasLookupInfo<ItemLookupInfo>
{ {
protected BaseItem() protected BaseItem()
{ {
@ -236,7 +236,7 @@ namespace MediaBrowser.Controller.Entities
{ {
var locationType = LocationType; var locationType = LocationType;
if (locationType != LocationType.Remote && locationType != LocationType.Virtual) if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
{ {
return new string[] { }; return new string[] { };
} }
@ -1455,5 +1455,24 @@ namespace MediaBrowser.Controller.Entities
return userdata == null || !userdata.Played; return userdata == null || !userdata.Played;
} }
ItemLookupInfo IHasLookupInfo<ItemLookupInfo>.GetLookupInfo()
{
return GetItemLookupInfo<ItemLookupInfo>();
}
protected T GetItemLookupInfo<T>()
where T : ItemLookupInfo, new()
{
return new T
{
MetadataCountryCode = GetPreferredMetadataCountryCode(),
MetadataLanguage = GetPreferredMetadataLanguage(),
Name = Name,
ProviderIds = ProviderIds,
IndexNumber = IndexNumber,
ParentIndexNumber = ParentIndexNumber
};
}
} }
} }

View file

@ -1,9 +1,10 @@
using MediaBrowser.Model.Configuration; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using System.Collections.Generic; using System.Collections.Generic;
namespace MediaBrowser.Controller.Entities namespace MediaBrowser.Controller.Entities
{ {
public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage, IHasLookupInfo<BookInfo>
{ {
public override string MediaType public override string MediaType
{ {
@ -38,5 +39,10 @@ namespace MediaBrowser.Controller.Entities
{ {
return config.BlockUnratedBooks; return config.BlockUnratedBooks;
} }
public BookInfo GetLookupInfo()
{
return GetItemLookupInfo<BookInfo>();
}
} }
} }

View file

@ -1,11 +1,12 @@
using MediaBrowser.Model.Configuration; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace MediaBrowser.Controller.Entities namespace MediaBrowser.Controller.Entities
{ {
public class Game : BaseItem, IHasSoundtracks, IHasTrailers, IHasThemeMedia, IHasTags, IHasScreenshots, IHasPreferredMetadataLanguage public class Game : BaseItem, IHasSoundtracks, IHasTrailers, IHasThemeMedia, IHasTags, IHasScreenshots, IHasPreferredMetadataLanguage, IHasLookupInfo<GameInfo>
{ {
public List<Guid> SoundtrackIds { get; set; } public List<Guid> SoundtrackIds { get; set; }
@ -115,5 +116,14 @@ namespace MediaBrowser.Controller.Entities
{ {
return config.BlockUnratedGames; return config.BlockUnratedGames;
} }
public GameInfo GetLookupInfo()
{
var id = GetItemLookupInfo<GameInfo>();
id.GameSystem = GameSystem;
return id;
}
} }
} }

View file

@ -1,4 +1,5 @@
using System.Runtime.Serialization; using System.Runtime.Serialization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Configuration;
using System; using System;
@ -7,7 +8,7 @@ namespace MediaBrowser.Controller.Entities
/// <summary> /// <summary>
/// Class GameSystem /// Class GameSystem
/// </summary> /// </summary>
public class GameSystem : Folder public class GameSystem : Folder, IHasLookupInfo<GameSystemInfo>
{ {
/// <summary> /// <summary>
/// Return the id that should be used to key display prefs for this item. /// Return the id that should be used to key display prefs for this item.
@ -47,5 +48,14 @@ namespace MediaBrowser.Controller.Entities
// Don't block. Determine by game // Don't block. Determine by game
return false; return false;
} }
public GameSystemInfo GetLookupInfo()
{
var id = GetItemLookupInfo<GameSystemInfo>();
id.Path = Path;
return id;
}
} }
} }

View file

@ -1,9 +1,8 @@
using MediaBrowser.Controller.Entities; using System;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Entities
{ {
/// <summary> /// <summary>
/// Interface IHasMetadata /// Interface IHasMetadata

View file

@ -1,15 +1,20 @@
using MediaBrowser.Model.Configuration; using MediaBrowser.Common.Progress;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Entities.Movies namespace MediaBrowser.Controller.Entities.Movies
{ {
/// <summary> /// <summary>
/// Class BoxSet /// Class BoxSet
/// </summary> /// </summary>
public class BoxSet : Folder, IHasTrailers, IHasTags, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder public class BoxSet : Folder, IHasTrailers, IHasTags, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IMetadataContainer
{ {
public BoxSet() public BoxSet()
{ {
@ -74,5 +79,67 @@ namespace MediaBrowser.Controller.Entities.Movies
// Default sorting // Default sorting
return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending); return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending);
} }
public BoxSetInfo GetLookupInfo()
{
return GetItemLookupInfo<BoxSetInfo>();
}
public async Task RefreshAllMetadata(MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
{
// Refresh bottom up, children first, then the boxset
// By then hopefully the movies within will have Tmdb collection values
var items = RecursiveChildren.ToList();
var totalItems = items.Count;
var percentages = new Dictionary<Guid, double>(totalItems);
var tasks = new List<Task>();
// Refresh songs
foreach (var item in items)
{
if (tasks.Count > 3)
{
await Task.WhenAll(tasks).ConfigureAwait(false);
tasks.Clear();
}
cancellationToken.ThrowIfCancellationRequested();
var innerProgress = new ActionableProgress<double>();
// Avoid implicitly captured closure
var currentChild = item;
innerProgress.RegisterAction(p =>
{
lock (percentages)
{
percentages[currentChild.Id] = p / 100;
var percent = percentages.Values.Sum();
percent /= totalItems;
percent *= 100;
progress.Report(percent);
}
});
tasks.Add(RefreshItem(item, refreshOptions, innerProgress, cancellationToken));
}
await Task.WhenAll(tasks).ConfigureAwait(false);
tasks.Clear();
// Refresh current item
await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
progress.Report(100);
}
private async Task RefreshItem(BaseItem item, MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
{
await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
progress.Report(100);
}
} }
} }

View file

@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Entities.Movies
/// <summary> /// <summary>
/// Class Movie /// Class Movie
/// </summary> /// </summary>
public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasAwards, IHasMetascore public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>
{ {
public List<Guid> SpecialFeatureIds { get; set; } public List<Guid> SpecialFeatureIds { get; set; }
@ -166,5 +166,10 @@ namespace MediaBrowser.Controller.Entities.Movies
{ {
return config.BlockUnratedMovies; return config.BlockUnratedMovies;
} }
public MovieInfo GetLookupInfo()
{
return GetItemLookupInfo<MovieInfo>();
}
} }
} }

View file

@ -1,11 +1,12 @@
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using System; using System;
namespace MediaBrowser.Controller.Entities namespace MediaBrowser.Controller.Entities
{ {
public class MusicVideo : Video, IHasArtist, IHasMusicGenres, IHasBudget public class MusicVideo : Video, IHasArtist, IHasMusicGenres, IHasBudget, IHasLookupInfo<MusicVideoInfo>
{ {
/// <summary> /// <summary>
/// Gets or sets the artist. /// Gets or sets the artist.
@ -54,5 +55,10 @@ namespace MediaBrowser.Controller.Entities
{ {
return config.BlockUnratedMusic; return config.BlockUnratedMusic;
} }
public MusicVideoInfo GetLookupInfo()
{
return GetItemLookupInfo<MusicVideoInfo>();
}
} }
} }

View file

@ -1,4 +1,5 @@
using MediaBrowser.Model.Dto; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Dto;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.Serialization; using System.Runtime.Serialization;
@ -7,7 +8,7 @@ namespace MediaBrowser.Controller.Entities
/// <summary> /// <summary>
/// This is the full Person object that can be retrieved with all of it's data. /// This is the full Person object that can be retrieved with all of it's data.
/// </summary> /// </summary>
public class Person : BaseItem, IItemByName public class Person : BaseItem, IItemByName, IHasLookupInfo<Providers.PersonLookupInfo>
{ {
public Person() public Person()
{ {
@ -31,6 +32,11 @@ namespace MediaBrowser.Controller.Entities
{ {
return "Person-" + Name; return "Person-" + Name;
} }
public Providers.PersonLookupInfo GetLookupInfo()
{
return GetItemLookupInfo<Providers.PersonLookupInfo>();
}
} }
/// <summary> /// <summary>

View file

@ -1,4 +1,5 @@
using MediaBrowser.Model.Configuration; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities.TV
/// <summary> /// <summary>
/// Class Episode /// Class Episode
/// </summary> /// </summary>
public class Episode : Video public class Episode : Video, IHasLookupInfo<EpisodeInfo>
{ {
/// <summary> /// <summary>
/// Gets the season in which it aired. /// Gets the season in which it aired.
@ -233,5 +234,21 @@ namespace MediaBrowser.Controller.Entities.TV
{ {
return config.BlockUnratedSeries; return config.BlockUnratedSeries;
} }
public EpisodeInfo GetLookupInfo()
{
var id = GetItemLookupInfo<EpisodeInfo>();
var series = Series;
if (series != null)
{
id.SeriesProviderIds = series.ProviderIds;
}
id.IndexNumberEnd = IndexNumberEnd;
return id;
}
} }
} }

View file

@ -1,5 +1,6 @@
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
@ -14,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.TV
/// <summary> /// <summary>
/// Class Series /// Class Series
/// </summary> /// </summary>
public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage, IHasDisplayOrder public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>
{ {
public List<Guid> SpecialFeatureIds { get; set; } public List<Guid> SpecialFeatureIds { get; set; }
public List<Guid> SoundtrackIds { get; set; } public List<Guid> SoundtrackIds { get; set; }
@ -222,5 +223,10 @@ namespace MediaBrowser.Controller.Entities.TV
} }
public string PreferredMetadataLanguage { get; set; } public string PreferredMetadataLanguage { get; set; }
public SeriesInfo GetLookupInfo()
{
return GetItemLookupInfo<SeriesInfo>();
}
} }
} }

View file

@ -1,4 +1,5 @@
using MediaBrowser.Model.Configuration; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities
/// <summary> /// <summary>
/// Class Trailer /// Class Trailer
/// </summary> /// </summary>
public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasMetascore public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasMetascore, IHasLookupInfo<TrailerInfo>
{ {
public List<Guid> SoundtrackIds { get; set; } public List<Guid> SoundtrackIds { get; set; }
@ -105,5 +106,10 @@ namespace MediaBrowser.Controller.Entities
{ {
return config.BlockUnratedTrailers; return config.BlockUnratedTrailers;
} }
public TrailerInfo GetLookupInfo()
{
return GetItemLookupInfo<TrailerInfo>();
}
} }
} }

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using System.Threading; using System.Threading;
namespace MediaBrowser.Controller.Library namespace MediaBrowser.Controller.Library

View file

@ -146,7 +146,7 @@
<Compile Include="Persistence\MediaStreamQuery.cs" /> <Compile Include="Persistence\MediaStreamQuery.cs" />
<Compile Include="Providers\ICustomMetadataProvider.cs" /> <Compile Include="Providers\ICustomMetadataProvider.cs" />
<Compile Include="Providers\IHasChangeMonitor.cs" /> <Compile Include="Providers\IHasChangeMonitor.cs" />
<Compile Include="Providers\IHasMetadata.cs" /> <Compile Include="Entities\IHasMetadata.cs" />
<Compile Include="Providers\IImageProvider.cs" /> <Compile Include="Providers\IImageProvider.cs" />
<Compile Include="Providers\ILocalMetadataProvider.cs" /> <Compile Include="Providers\ILocalMetadataProvider.cs" />
<Compile Include="Providers\IProviderRepository.cs" /> <Compile Include="Providers\IProviderRepository.cs" />
@ -155,7 +155,7 @@
<Compile Include="Providers\IMetadataProvider.cs" /> <Compile Include="Providers\IMetadataProvider.cs" />
<Compile Include="Providers\IMetadataService.cs" /> <Compile Include="Providers\IMetadataService.cs" />
<Compile Include="Providers\IRemoteMetadataProvider.cs" /> <Compile Include="Providers\IRemoteMetadataProvider.cs" />
<Compile Include="Providers\ItemId.cs" /> <Compile Include="Providers\ItemLookupInfo.cs" />
<Compile Include="Providers\MetadataRefreshOptions.cs" /> <Compile Include="Providers\MetadataRefreshOptions.cs" />
<Compile Include="Providers\NameParser.cs" /> <Compile Include="Providers\NameParser.cs" />
<Compile Include="Providers\MetadataStatus.cs" /> <Compile Include="Providers\MetadataStatus.cs" />

View file

@ -479,7 +479,7 @@ namespace MediaBrowser.Controller.Providers
case "Director": case "Director":
{ {
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Director })) foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new Entities.PersonInfo { Name = v.Trim(), Type = PersonType.Director }))
{ {
if (string.IsNullOrWhiteSpace(p.Name)) if (string.IsNullOrWhiteSpace(p.Name))
{ {
@ -491,7 +491,7 @@ namespace MediaBrowser.Controller.Providers
} }
case "Writer": case "Writer":
{ {
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Writer })) foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new Entities.PersonInfo { Name = v.Trim(), Type = PersonType.Writer }))
{ {
if (string.IsNullOrWhiteSpace(p.Name)) if (string.IsNullOrWhiteSpace(p.Name))
{ {
@ -516,7 +516,7 @@ namespace MediaBrowser.Controller.Providers
else else
{ {
// Old-style piped string // Old-style piped string
foreach (var p in SplitNames(actors).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Actor })) foreach (var p in SplitNames(actors).Select(v => new Entities.PersonInfo { Name = v.Trim(), Type = PersonType.Actor }))
{ {
if (string.IsNullOrWhiteSpace(p.Name)) if (string.IsNullOrWhiteSpace(p.Name))
{ {
@ -530,7 +530,7 @@ namespace MediaBrowser.Controller.Providers
case "GuestStars": case "GuestStars":
{ {
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.GuestStar })) foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new Entities.PersonInfo { Name = v.Trim(), Type = PersonType.GuestStar }))
{ {
if (string.IsNullOrWhiteSpace(p.Name)) if (string.IsNullOrWhiteSpace(p.Name))
{ {
@ -1195,7 +1195,7 @@ namespace MediaBrowser.Controller.Providers
/// </summary> /// </summary>
/// <param name="reader">The reader.</param> /// <param name="reader">The reader.</param>
/// <returns>IEnumerable{PersonInfo}.</returns> /// <returns>IEnumerable{PersonInfo}.</returns>
private IEnumerable<PersonInfo> GetPersonsFromXmlNode(XmlReader reader) private IEnumerable<Entities.PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
{ {
var name = string.Empty; var name = string.Empty;
var type = "Actor"; // If type is not specified assume actor var type = "Actor"; // If type is not specified assume actor
@ -1257,7 +1257,7 @@ namespace MediaBrowser.Controller.Providers
} }
} }
var personInfo = new PersonInfo var personInfo = new Entities.PersonInfo
{ {
Name = name.Trim(), Name = name.Trim(),
Role = role, Role = role,

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;

View file

@ -1,4 +1,5 @@
using System; using System;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Providers
{ {

View file

@ -1,5 +1,6 @@
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Providers
{ {

View file

@ -1,4 +1,5 @@
using System; using System;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Providers
{ {

View file

@ -1,5 +1,6 @@
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Providers
{ {

View file

@ -1,5 +1,6 @@
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Providers
{ {
@ -7,15 +8,10 @@ namespace MediaBrowser.Controller.Providers
{ {
} }
public interface IRemoteMetadataProvider<TItemType> : IMetadataProvider<TItemType>, IRemoteMetadataProvider public interface IRemoteMetadataProvider<TItemType, in TLookupInfoType> : IMetadataProvider<TItemType>, IRemoteMetadataProvider
where TItemType : IHasMetadata where TItemType : IHasMetadata, IHasLookupInfo<TLookupInfoType>
where TLookupInfoType : ItemLookupInfo, new()
{ {
/// <summary> Task<MetadataResult<TItemType>> GetMetadata(TLookupInfoType info, CancellationToken cancellationToken);
/// Gets the metadata.
/// </summary>
/// <param name="id">The identifier.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{MetadataResult{`0}}.</returns>
Task<MetadataResult<TItemType>> GetMetadata(ItemId id, CancellationToken cancellationToken);
} }
} }

View file

@ -4,7 +4,7 @@ using System.Collections.Generic;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Providers
{ {
public class ItemId : IHasProviderIds public class ItemLookupInfo : IHasProviderIds
{ {
/// <summary> /// <summary>
/// Gets or sets the name. /// Gets or sets the name.
@ -34,13 +34,29 @@ namespace MediaBrowser.Controller.Providers
public int? IndexNumber { get; set; } public int? IndexNumber { get; set; }
public int? ParentIndexNumber { get; set; } public int? ParentIndexNumber { get; set; }
public ItemId() public ItemLookupInfo()
{ {
ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
} }
} }
public class AlbumId : ItemId public interface IHasLookupInfo<out TLookupInfoType>
where TLookupInfoType : ItemLookupInfo, new()
{
TLookupInfoType GetLookupInfo();
}
public class ArtistInfo : ItemLookupInfo
{
public List<SongInfo> SongInfos { get; set; }
public ArtistInfo()
{
SongInfos = new List<SongInfo>();
}
}
public class AlbumInfo : ItemLookupInfo
{ {
/// <summary> /// <summary>
/// Gets or sets the album artist. /// Gets or sets the album artist.
@ -53,14 +69,16 @@ namespace MediaBrowser.Controller.Providers
/// </summary> /// </summary>
/// <value>The artist provider ids.</value> /// <value>The artist provider ids.</value>
public Dictionary<string, string> ArtistProviderIds { get; set; } public Dictionary<string, string> ArtistProviderIds { get; set; }
public List<SongInfo> SongInfos { get; set; }
public AlbumId() public AlbumInfo()
{ {
ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
SongInfos = new List<SongInfo>();
} }
} }
public class GameId : ItemId public class GameInfo : ItemLookupInfo
{ {
/// <summary> /// <summary>
/// Gets or sets the game system. /// Gets or sets the game system.
@ -69,7 +87,7 @@ namespace MediaBrowser.Controller.Providers
public string GameSystem { get; set; } public string GameSystem { get; set; }
} }
public class GameSystemId : ItemId public class GameSystemInfo : ItemLookupInfo
{ {
/// <summary> /// <summary>
/// Gets or sets the path. /// Gets or sets the path.
@ -78,15 +96,57 @@ namespace MediaBrowser.Controller.Providers
public string Path { get; set; } public string Path { get; set; }
} }
public class EpisodeId : ItemId public class EpisodeInfo : ItemLookupInfo
{ {
public Dictionary<string, string> SeriesProviderIds { get; set; } public Dictionary<string, string> SeriesProviderIds { get; set; }
public int? IndexNumberEnd { get; set; } public int? IndexNumberEnd { get; set; }
public EpisodeId() public EpisodeInfo()
{ {
SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
} }
} }
public class SongInfo : ItemLookupInfo
{
public string AlbumArtist { get; set; }
public string Album { get; set; }
public List<string> Artists { get; set; }
}
public class SeriesInfo : ItemLookupInfo
{
}
public class PersonLookupInfo : ItemLookupInfo
{
}
public class MovieInfo : ItemLookupInfo
{
}
public class BoxSetInfo : ItemLookupInfo
{
}
public class MusicVideoInfo : ItemLookupInfo
{
}
public class TrailerInfo : ItemLookupInfo
{
}
public class BookInfo : ItemLookupInfo
{
}
} }

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.AdultVideos namespace MediaBrowser.Providers.AdultVideos
{ {
class AdultVideoMetadataService : MetadataService<AdultVideo, ItemId> class AdultVideoMetadataService : MetadataService<AdultVideo, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -1,4 +1,5 @@
using MediaBrowser.Common.IO; using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using System; using System;
using System.IO; using System.IO;
@ -64,7 +65,7 @@ namespace MediaBrowser.Providers
return false; return false;
} }
return FileSystem.GetLastWriteTimeUtc(file) > date; return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > date;
} }
public string Name public string Name

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Books namespace MediaBrowser.Providers.Books
{ {
public class BookMetadataService : MetadataService<Book, ItemId> public class BookMetadataService : MetadataService<Book, BookInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -16,7 +16,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.BoxSets namespace MediaBrowser.Providers.BoxSets
{ {
public class BoxSetMetadataService : MetadataService<BoxSet, ItemId> public class BoxSetMetadataService : MetadataService<BoxSet, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
private readonly ILocalizationManager _iLocalizationManager; private readonly ILocalizationManager _iLocalizationManager;

View file

@ -17,7 +17,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.BoxSets namespace MediaBrowser.Providers.BoxSets
{ {
public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet> public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet, BoxSetInfo>
{ {
private readonly CultureInfo _enUs = new CultureInfo("en-US"); private readonly CultureInfo _enUs = new CultureInfo("en-US");
private const string GetCollectionInfo3 = @"http://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images"; private const string GetCollectionInfo3 = @"http://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images";
@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.BoxSets
Current = this; Current = this;
} }
public async Task<MetadataResult<BoxSet>> GetMetadata(ItemId id, CancellationToken cancellationToken) public async Task<MetadataResult<BoxSet>> GetMetadata(BoxSetInfo id, CancellationToken cancellationToken)
{ {
var tmdbId = id.GetProviderId(MetadataProviders.Tmdb); var tmdbId = id.GetProviderId(MetadataProviders.Tmdb);
@ -188,7 +188,7 @@ namespace MediaBrowser.Providers.BoxSets
return DownloadInfo(tmdbId, preferredMetadataLanguage, cancellationToken); return DownloadInfo(tmdbId, preferredMetadataLanguage, cancellationToken);
} }
private Task<string> GetTmdbId(ItemId id, CancellationToken cancellationToken) private Task<string> GetTmdbId(ItemLookupInfo id, CancellationToken cancellationToken)
{ {
return new MovieDbSearch(_logger, _json).FindCollectionId(id, cancellationToken); return new MovieDbSearch(_logger, _json).FindCollectionId(id, cancellationToken);
} }

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Folders namespace MediaBrowser.Providers.Folders
{ {
public class FolderMetadataService : MetadataService<Folder, ItemId> public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.GameGenres namespace MediaBrowser.Providers.GameGenres
{ {
public class GameGenreMetadataService : MetadataService<GameGenre, ItemId> public class GameGenreMetadataService : MetadataService<GameGenre, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Games namespace MediaBrowser.Providers.Games
{ {
public class GameMetadataService : MetadataService<Game, GameId> public class GameMetadataService : MetadataService<Game, GameInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
@ -44,14 +44,5 @@ namespace MediaBrowser.Providers.Games
{ {
return _libraryManager.UpdateItem(item, reason, cancellationToken); return _libraryManager.UpdateItem(item, reason, cancellationToken);
} }
protected override GameId GetId(Game item)
{
var id = base.GetId(item);
id.GameSystem = item.GameSystem;
return id;
}
} }
} }

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Games namespace MediaBrowser.Providers.Games
{ {
public class GameSystemMetadataService : MetadataService<GameSystem, GameSystemId> public class GameSystemMetadataService : MetadataService<GameSystem, GameSystemInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
@ -44,14 +44,5 @@ namespace MediaBrowser.Providers.Games
{ {
return _libraryManager.UpdateItem(item, reason, cancellationToken); return _libraryManager.UpdateItem(item, reason, cancellationToken);
} }
protected override GameSystemId GetId(GameSystem item)
{
var id = base.GetId(item);
id.Path = item.Path;
return id;
}
} }
} }

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Genres namespace MediaBrowser.Providers.Genres
{ {
public class GenreMetadataService : MetadataService<Genre, ItemId> public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.LiveTv namespace MediaBrowser.Providers.LiveTv
{ {
public class ChannelMetadataService : MetadataService<LiveTvChannel, ItemId> public class ChannelMetadataService : MetadataService<LiveTvChannel, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.LiveTv namespace MediaBrowser.Providers.LiveTv
{ {
public class ProgramMetadataService : MetadataService<LiveTvProgram, ItemId> public class ProgramMetadataService : MetadataService<LiveTvProgram, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -16,8 +16,8 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Manager namespace MediaBrowser.Providers.Manager
{ {
public abstract class MetadataService<TItemType, TIdType> : IMetadataService public abstract class MetadataService<TItemType, TIdType> : IMetadataService
where TItemType : IHasMetadata, new() where TItemType : IHasMetadata, IHasLookupInfo<TIdType>, new()
where TIdType : ItemId, new() where TIdType : ItemLookupInfo, new()
{ {
protected readonly IServerConfigurationManager ServerConfigurationManager; protected readonly IServerConfigurationManager ServerConfigurationManager;
protected readonly ILogger Logger; protected readonly ILogger Logger;
@ -238,27 +238,6 @@ namespace MediaBrowser.Providers.Manager
protected abstract Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken); protected abstract Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken);
protected virtual TIdType GetId(TItemType item)
{
var id = new TIdType
{
MetadataCountryCode = item.GetPreferredMetadataCountryCode(),
MetadataLanguage = item.GetPreferredMetadataLanguage(),
Name = item.Name,
ProviderIds = item.ProviderIds
};
var baseItem = item as BaseItem;
if (baseItem != null)
{
id.IndexNumber = baseItem.IndexNumber;
id.ParentIndexNumber = baseItem.ParentIndexNumber;
}
return id;
}
public bool CanRefresh(IHasMetadata item) public bool CanRefresh(IHasMetadata item)
{ {
return item is TItemType; return item is TItemType;
@ -278,7 +257,7 @@ namespace MediaBrowser.Providers.Manager
// If replacing all metadata, run internet providers first // If replacing all metadata, run internet providers first
if (options.ReplaceAllMetadata) if (options.ReplaceAllMetadata)
{ {
await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType>>(), refreshResult, cancellationToken).ConfigureAwait(false); await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), refreshResult, cancellationToken).ConfigureAwait(false);
} }
var hasLocalMetadata = false; var hasLocalMetadata = false;
@ -326,7 +305,7 @@ namespace MediaBrowser.Providers.Manager
if (!options.ReplaceAllMetadata && !hasLocalMetadata) if (!options.ReplaceAllMetadata && !hasLocalMetadata)
{ {
await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType>>(), refreshResult, cancellationToken).ConfigureAwait(false); await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), refreshResult, cancellationToken).ConfigureAwait(false);
} }
if (refreshResult.UpdateType > ItemUpdateType.Unspecified) if (refreshResult.UpdateType > ItemUpdateType.Unspecified)
@ -367,14 +346,16 @@ namespace MediaBrowser.Providers.Manager
return new TItemType(); return new TItemType();
} }
private async Task ExecuteRemoteProviders(TItemType item, TItemType temp, IEnumerable<IRemoteMetadataProvider<TItemType>> providers, RefreshResult refreshResult, CancellationToken cancellationToken) private async Task ExecuteRemoteProviders(TItemType item, TItemType temp, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, RefreshResult refreshResult, CancellationToken cancellationToken)
{ {
var id = GetId(item); TIdType id = null;
foreach (var provider in providers) foreach (var provider in providers)
{ {
Logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name); Logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name);
id = id ?? item.GetLookupInfo();
try try
{ {
var result = await provider.GetMetadata(id, cancellationToken).ConfigureAwait(false); var result = await provider.GetMetadata(id, cancellationToken).ConfigureAwait(false);

View file

@ -93,6 +93,7 @@
<Compile Include="MediaInfo\FFProbeHelpers.cs" /> <Compile Include="MediaInfo\FFProbeHelpers.cs" />
<Compile Include="MediaInfo\FFProbeProvider.cs" /> <Compile Include="MediaInfo\FFProbeProvider.cs" />
<Compile Include="MediaInfo\FFProbeVideoInfo.cs" /> <Compile Include="MediaInfo\FFProbeVideoInfo.cs" />
<Compile Include="Movies\MovieDbTrailerProvider.cs" />
<Compile Include="Movies\TrailerMetadataService.cs" /> <Compile Include="Movies\TrailerMetadataService.cs" />
<Compile Include="Movies\GenericMovieDbInfo.cs" /> <Compile Include="Movies\GenericMovieDbInfo.cs" />
<Compile Include="Movies\MovieDbSearch.cs" /> <Compile Include="Movies\MovieDbSearch.cs" />
@ -115,6 +116,7 @@
<Compile Include="Music\ArtistMetadataService.cs" /> <Compile Include="Music\ArtistMetadataService.cs" />
<Compile Include="Music\AudioMetadataService.cs" /> <Compile Include="Music\AudioMetadataService.cs" />
<Compile Include="Music\LastfmArtistProvider.cs" /> <Compile Include="Music\LastfmArtistProvider.cs" />
<Compile Include="Music\MovieDbMusicVideoProvider.cs" />
<Compile Include="Music\MusicBrainzArtistProvider.cs" /> <Compile Include="Music\MusicBrainzArtistProvider.cs" />
<Compile Include="Music\MusicVideoMetadataService.cs" /> <Compile Include="Music\MusicVideoMetadataService.cs" />
<Compile Include="Music\MusicVideoXmlProvider.cs" /> <Compile Include="Music\MusicVideoXmlProvider.cs" />

View file

@ -12,6 +12,7 @@ using System.Linq;
using System.Net; using System.Net;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo;
namespace MediaBrowser.Providers.Movies namespace MediaBrowser.Providers.Movies
{ {
@ -29,7 +30,7 @@ namespace MediaBrowser.Providers.Movies
_jsonSerializer = jsonSerializer; _jsonSerializer = jsonSerializer;
} }
public async Task<MetadataResult<T>> GetMetadata(ItemId itemId, CancellationToken cancellationToken) public async Task<MetadataResult<T>> GetMetadata(ItemLookupInfo itemId, CancellationToken cancellationToken)
{ {
var result = new MetadataResult<T>(); var result = new MetadataResult<T>();

View file

@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.Movies
/// <summary> /// <summary>
/// Class MovieDbProvider /// Class MovieDbProvider
/// </summary> /// </summary>
public class MovieDbProvider : IRemoteMetadataProvider<Movie>, IDisposable, IHasChangeMonitor public class MovieDbProvider : IRemoteMetadataProvider<Movie, MovieInfo>, IDisposable, IHasChangeMonitor
{ {
internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(1, 1); internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(1, 1);
@ -41,12 +41,12 @@ namespace MediaBrowser.Providers.Movies
Current = this; Current = this;
} }
public Task<MetadataResult<Movie>> GetMetadata(ItemId id, CancellationToken cancellationToken) public Task<MetadataResult<Movie>> GetMetadata(MovieInfo info, CancellationToken cancellationToken)
{ {
return GetItemMetadata<Movie>(id, cancellationToken); return GetItemMetadata<Movie>(info, cancellationToken);
} }
public Task<MetadataResult<T>> GetItemMetadata<T>(ItemId id, CancellationToken cancellationToken) public Task<MetadataResult<T>> GetItemMetadata<T>(ItemLookupInfo id, CancellationToken cancellationToken)
where T : Video, new () where T : Video, new ()
{ {
var movieDb = new GenericMovieDbInfo<T>(_logger, _jsonSerializer); var movieDb = new GenericMovieDbInfo<T>(_logger, _jsonSerializer);

View file

@ -29,17 +29,17 @@ namespace MediaBrowser.Providers.Movies
_json = json; _json = json;
} }
public Task<string> FindMovieId(ItemId idInfo, CancellationToken cancellationToken) public Task<string> FindMovieId(ItemLookupInfo idInfo, CancellationToken cancellationToken)
{ {
return FindId(idInfo, "movie", cancellationToken); return FindId(idInfo, "movie", cancellationToken);
} }
public Task<string> FindCollectionId(ItemId idInfo, CancellationToken cancellationToken) public Task<string> FindCollectionId(ItemLookupInfo idInfo, CancellationToken cancellationToken)
{ {
return FindId(idInfo, "collection", cancellationToken); return FindId(idInfo, "collection", cancellationToken);
} }
private async Task<string> FindId(ItemId idInfo, string searchType, CancellationToken cancellationToken) private async Task<string> FindId(ItemLookupInfo idInfo, string searchType, CancellationToken cancellationToken)
{ {
int? yearInName; int? yearInName;
var name = idInfo.Name; var name = idInfo.Name;

View file

@ -0,0 +1,26 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Providers.Movies
{
public class MovieDbTrailerProvider : IRemoteMetadataProvider<Trailer, TrailerInfo>, IHasChangeMonitor
{
public Task<MetadataResult<Trailer>> GetMetadata(TrailerInfo info, CancellationToken cancellationToken)
{
return MovieDbProvider.Current.GetItemMetadata<Trailer>(info, cancellationToken);
}
public string Name
{
get { return MovieDbProvider.Current.Name; }
}
public bool HasChanged(IHasMetadata item, DateTime date)
{
return MovieDbProvider.Current.HasChanged(item, date);
}
}
}

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Movies namespace MediaBrowser.Providers.Movies
{ {
public class MovieMetadataService : MetadataService<Movie, ItemId> public class MovieMetadataService : MetadataService<Movie, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Movies namespace MediaBrowser.Providers.Movies
{ {
public class TrailerMetadataService : MetadataService<Trailer, ItemId> public class TrailerMetadataService : MetadataService<Trailer, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -14,7 +14,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumId> public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
@ -102,23 +102,6 @@ namespace MediaBrowser.Providers.Music
return updateType; return updateType;
} }
protected override AlbumId GetId(MusicAlbum item)
{
var id = base.GetId(item);
id.AlbumArtist = item.AlbumArtist;
var artist = item.Parents.OfType<MusicArtist>().FirstOrDefault();
if (artist != null)
{
id.ArtistProviderIds = artist.ProviderIds;
id.AlbumArtist = id.AlbumArtist ?? artist.Name;
}
return id;
}
private ItemUpdateType SetAlbumArtistFromSongs(MusicAlbum item, IEnumerable<Audio> songs) private ItemUpdateType SetAlbumArtistFromSongs(MusicAlbum item, IEnumerable<Audio> songs)
{ {
var updateType = ItemUpdateType.Unspecified; var updateType = ItemUpdateType.Unspecified;

View file

@ -14,7 +14,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
public class ArtistMetadataService : MetadataService<MusicArtist, ItemId> public class ArtistMetadataService : MetadataService<MusicArtist, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
public class AudioMetadataService : MetadataService<Audio, ItemId> public class AudioMetadataService : MetadataService<Audio, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -14,7 +14,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
public class LastfmAlbumProvider : IRemoteMetadataProvider<MusicAlbum>, IHasOrder public class LastfmAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
{ {
private readonly IJsonSerializer _json; private readonly IJsonSerializer _json;
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
@ -30,11 +30,11 @@ namespace MediaBrowser.Providers.Music
_logger = logger; _logger = logger;
} }
public async Task<MetadataResult<MusicAlbum>> GetMetadata(ItemId id, CancellationToken cancellationToken) public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken)
{ {
var result = new MetadataResult<MusicAlbum>(); var result = new MetadataResult<MusicAlbum>();
var lastFmData = await GetAlbumResult((AlbumId)id, cancellationToken).ConfigureAwait(false); var lastFmData = await GetAlbumResult(id, cancellationToken).ConfigureAwait(false);
if (lastFmData != null && lastFmData.album != null) if (lastFmData != null && lastFmData.album != null)
{ {
@ -45,7 +45,7 @@ namespace MediaBrowser.Providers.Music
return result; return result;
} }
private async Task<LastfmGetAlbumResult> GetAlbumResult(AlbumId item, CancellationToken cancellationToken) private async Task<LastfmGetAlbumResult> GetAlbumResult(AlbumInfo item, CancellationToken cancellationToken)
{ {
// Try album release Id // Try album release Id
if (!string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.Musicbrainz))) if (!string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.Musicbrainz)))

View file

@ -17,7 +17,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
public class LastfmArtistProvider : IRemoteMetadataProvider<MusicArtist>, IHasOrder public class LastfmArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>, IHasOrder
{ {
private readonly IJsonSerializer _json; private readonly IJsonSerializer _json;
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.Music
_logger = logger; _logger = logger;
} }
public async Task<MetadataResult<MusicArtist>> GetMetadata(ItemId id, CancellationToken cancellationToken) public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo id, CancellationToken cancellationToken)
{ {
var result = new MetadataResult<MusicArtist>(); var result = new MetadataResult<MusicArtist>();

View file

@ -0,0 +1,27 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Providers.Movies;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Providers.Music
{
public class MovieDbMusicVideoProvider : IRemoteMetadataProvider<MusicVideo, MusicVideoInfo>, IHasChangeMonitor
{
public Task<MetadataResult<MusicVideo>> GetMetadata(MusicVideoInfo info, CancellationToken cancellationToken)
{
return MovieDbProvider.Current.GetItemMetadata<MusicVideo>(info, cancellationToken);
}
public string Name
{
get { return MovieDbProvider.Current.Name; }
}
public bool HasChanged(IHasMetadata item, DateTime date)
{
return MovieDbProvider.Current.HasChanged(item, date);
}
}
}

View file

@ -13,7 +13,7 @@ using System.Xml;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum>, IHasOrder public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
{ {
internal static MusicBrainzAlbumProvider Current; internal static MusicBrainzAlbumProvider Current;
@ -27,9 +27,9 @@ namespace MediaBrowser.Providers.Music
Current = this; Current = this;
} }
public async Task<MetadataResult<MusicAlbum>> GetMetadata(ItemId id, CancellationToken cancellationToken) public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken)
{ {
var albumId = (AlbumId)id; var albumId = id;
var releaseId = albumId.GetProviderId(MetadataProviders.Musicbrainz); var releaseId = albumId.GetProviderId(MetadataProviders.Musicbrainz);
var releaseGroupId = albumId.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup); var releaseGroupId = albumId.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);

View file

@ -12,9 +12,9 @@ using System.Xml;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
public class MusicBrainzArtistProvider : IRemoteMetadataProvider<MusicArtist> public class MusicBrainzArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>
{ {
public async Task<MetadataResult<MusicArtist>> GetMetadata(ItemId id, CancellationToken cancellationToken) public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo id, CancellationToken cancellationToken)
{ {
var result = new MetadataResult<MusicArtist>(); var result = new MetadataResult<MusicArtist>();
@ -39,7 +39,7 @@ namespace MediaBrowser.Providers.Music
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{System.String}.</returns> /// <returns>Task{System.String}.</returns>
private async Task<string> FindId(ItemId item, CancellationToken cancellationToken) private async Task<string> FindId(ItemLookupInfo item, CancellationToken cancellationToken)
{ {
// They seem to throw bad request failures on any term with a slash // They seem to throw bad request failures on any term with a slash
var nameToSearch = item.Name.Replace('/', ' '); var nameToSearch = item.Name.Replace('/', ' ');

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Music namespace MediaBrowser.Providers.Music
{ {
class MusicVideoMetadataService : MetadataService<MusicVideo, ItemId> class MusicVideoMetadataService : MetadataService<MusicVideo, MusicVideoInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.MusicGenres namespace MediaBrowser.Providers.MusicGenres
{ {
public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemId> public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -18,7 +18,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.People namespace MediaBrowser.Providers.People
{ {
public class MovieDbPersonProvider : IRemoteMetadataProvider<Person> public class MovieDbPersonProvider : IRemoteMetadataProvider<Person, PersonLookupInfo>
{ {
const string DataFileName = "info.json"; const string DataFileName = "info.json";
@ -41,7 +41,7 @@ namespace MediaBrowser.Providers.People
get { return "TheMovieDb"; } get { return "TheMovieDb"; }
} }
public async Task<MetadataResult<Person>> GetMetadata(ItemId id, CancellationToken cancellationToken) public async Task<MetadataResult<Person>> GetMetadata(PersonLookupInfo id, CancellationToken cancellationToken)
{ {
var tmdbId = id.GetProviderId(MetadataProviders.Tmdb); var tmdbId = id.GetProviderId(MetadataProviders.Tmdb);

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.People namespace MediaBrowser.Providers.People
{ {
public class PersonMetadataService : MetadataService<Person, ItemId> public class PersonMetadataService : MetadataService<Person, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using System.Collections.Generic; using System.Collections.Generic;

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Persistence;

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;

View file

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Studios namespace MediaBrowser.Providers.Studios
{ {
public class StudioMetadataService : MetadataService<Studio, ItemId> public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -1,5 +1,4 @@
using System.IO; using MediaBrowser.Common.IO;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
@ -8,12 +7,13 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager; using MediaBrowser.Providers.Manager;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace MediaBrowser.Providers.TV namespace MediaBrowser.Providers.TV
{ {
public class EpisodeMetadataService : MetadataService<Episode, EpisodeId> public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
@ -76,22 +76,6 @@ namespace MediaBrowser.Providers.TV
return _libraryManager.UpdateItem(item, reason, cancellationToken); return _libraryManager.UpdateItem(item, reason, cancellationToken);
} }
protected override EpisodeId GetId(Episode item)
{
var id = base.GetId(item);
var series = item.Series;
if (series != null)
{
id.SeriesProviderIds = series.ProviderIds;
}
id.IndexNumberEnd = item.IndexNumberEnd;
return id;
}
protected override ItemUpdateType BeforeMetadataRefresh(Episode item) protected override ItemUpdateType BeforeMetadataRefresh(Episode item)
{ {
var updateType = base.BeforeMetadataRefresh(item); var updateType = base.BeforeMetadataRefresh(item);

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.TV namespace MediaBrowser.Providers.TV
{ {
public class SeasonMetadataService : MetadataService<Season, ItemId> public class SeasonMetadataService : MetadataService<Season, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -13,7 +13,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.TV namespace MediaBrowser.Providers.TV
{ {
public class SeriesMetadataService : MetadataService<Series, ItemId> public class SeriesMetadataService : MetadataService<Series, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
@ -59,7 +59,6 @@ namespace MediaBrowser.Providers.TV
if (dateLastEpisodeAdded != item.DateLastEpisodeAdded) if (dateLastEpisodeAdded != item.DateLastEpisodeAdded)
{ {
Logger.Debug("DateLastEpisodeAdded changed for {0}", item.Path);
updateType = updateType | ItemUpdateType.MetadataImport; updateType = updateType | ItemUpdateType.MetadataImport;
} }

View file

@ -16,6 +16,7 @@ using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml; using System.Xml;
using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo;
namespace MediaBrowser.Providers.TV namespace MediaBrowser.Providers.TV
{ {
@ -23,7 +24,7 @@ namespace MediaBrowser.Providers.TV
/// <summary> /// <summary>
/// Class RemoteEpisodeProvider /// Class RemoteEpisodeProvider
/// </summary> /// </summary>
class TvdbEpisodeProvider : IRemoteMetadataProvider<Episode>, IHasChangeMonitor class TvdbEpisodeProvider : IRemoteMetadataProvider<Episode, EpisodeInfo>, IHasChangeMonitor
{ {
internal static TvdbEpisodeProvider Current; internal static TvdbEpisodeProvider Current;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
@ -41,9 +42,9 @@ namespace MediaBrowser.Providers.TV
get { return "TheTVDB"; } get { return "TheTVDB"; }
} }
public Task<MetadataResult<Episode>> GetMetadata(ItemId id, CancellationToken cancellationToken) public Task<MetadataResult<Episode>> GetMetadata(EpisodeInfo id, CancellationToken cancellationToken)
{ {
var episodeId = (EpisodeId)id; var episodeId = id;
string seriesTvdbId; string seriesTvdbId;
episodeId.SeriesProviderIds.TryGetValue(MetadataProviders.Tvdb.ToString(), out seriesTvdbId); episodeId.SeriesProviderIds.TryGetValue(MetadataProviders.Tvdb.ToString(), out seriesTvdbId);
@ -172,7 +173,7 @@ namespace MediaBrowser.Providers.TV
/// <param name="seriesDataPath">The series data path.</param> /// <param name="seriesDataPath">The series data path.</param>
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{System.Boolean}.</returns> /// <returns>Task{System.Boolean}.</returns>
private Episode FetchEpisodeData(EpisodeId id, string seriesDataPath, CancellationToken cancellationToken) private Episode FetchEpisodeData(EpisodeInfo id, string seriesDataPath, CancellationToken cancellationToken)
{ {
if (id.IndexNumber == null) if (id.IndexNumber == null)
{ {

View file

@ -19,10 +19,11 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml; using System.Xml;
using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo;
namespace MediaBrowser.Providers.TV namespace MediaBrowser.Providers.TV
{ {
public class TvdbSeriesProvider : IRemoteMetadataProvider<Series>, IHasChangeMonitor public class TvdbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasChangeMonitor
{ {
internal readonly SemaphoreSlim TvDbResourcePool = new SemaphoreSlim(2, 2); internal readonly SemaphoreSlim TvDbResourcePool = new SemaphoreSlim(2, 2);
internal static TvdbSeriesProvider Current { get; private set; } internal static TvdbSeriesProvider Current { get; private set; }
@ -47,7 +48,7 @@ namespace MediaBrowser.Providers.TV
private const string SeriesQuery = "GetSeries.php?seriesname={0}"; private const string SeriesQuery = "GetSeries.php?seriesname={0}";
private const string SeriesGetZip = "http://www.thetvdb.com/api/{0}/series/{1}/all/{2}.zip"; private const string SeriesGetZip = "http://www.thetvdb.com/api/{0}/series/{1}/all/{2}.zip";
public async Task<MetadataResult<Series>> GetMetadata(ItemId itemId, CancellationToken cancellationToken) public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo itemId, CancellationToken cancellationToken)
{ {
var result = new MetadataResult<Series>(); var result = new MetadataResult<Series>();

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Users namespace MediaBrowser.Providers.Users
{ {
public class UserMetadataService : MetadataService<User, ItemId> public class UserMetadataService : MetadataService<User, ItemLookupInfo>
{ {
private readonly IUserManager _userManager; private readonly IUserManager _userManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Videos namespace MediaBrowser.Providers.Videos
{ {
public class VideoMetadataService : MetadataService<Video, ItemId> public class VideoMetadataService : MetadataService<Video, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Years namespace MediaBrowser.Providers.Years
{ {
public class YearMetadataService : MetadataService<Year, ItemId> public class YearMetadataService : MetadataService<Year, ItemLookupInfo>
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;

View file

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata> <metadata>
<id>MediaBrowser.Common.Internal</id> <id>MediaBrowser.Common.Internal</id>
<version>3.0.318</version> <version>3.0.320</version>
<title>MediaBrowser.Common.Internal</title> <title>MediaBrowser.Common.Internal</title>
<authors>Luke</authors> <authors>Luke</authors>
<owners>ebr,Luke,scottisafool</owners> <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> <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> <copyright>Copyright © Media Browser 2013</copyright>
<dependencies> <dependencies>
<dependency id="MediaBrowser.Common" version="3.0.318" /> <dependency id="MediaBrowser.Common" version="3.0.320" />
<dependency id="NLog" version="2.1.0" /> <dependency id="NLog" version="2.1.0" />
<dependency id="SimpleInjector" version="2.4.1" /> <dependency id="SimpleInjector" version="2.4.1" />
<dependency id="sharpcompress" version="0.10.2" /> <dependency id="sharpcompress" version="0.10.2" />

View file

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

View file

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