Merge pull request #1852 from Bond-009/warn9

Fix some more warnings
This commit is contained in:
dkanada 2019-11-02 01:24:44 +09:00 committed by GitHub
commit 89a21c96c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
79 changed files with 898 additions and 715 deletions

View file

@ -362,7 +362,7 @@ namespace Emby.Server.Implementations
{ {
_configuration = configuration; _configuration = configuration;
XmlSerializer = new MyXmlSerializer(fileSystem, loggerFactory); XmlSerializer = new MyXmlSerializer();
NetworkManager = networkManager; NetworkManager = networkManager;
networkManager.LocalSubnetsFn = GetConfiguredLocalSubnets; networkManager.LocalSubnetsFn = GetConfiguredLocalSubnets;
@ -906,7 +906,7 @@ namespace Emby.Server.Implementations
_displayPreferencesRepository.Initialize(); _displayPreferencesRepository.Initialize();
var userDataRepo = new SqliteUserDataRepository(LoggerFactory, ApplicationPaths); var userDataRepo = new SqliteUserDataRepository(LoggerFactory.CreateLogger<SqliteUserDataRepository>(), ApplicationPaths);
SetStaticProperties(); SetStaticProperties();

View file

@ -470,7 +470,7 @@ namespace Emby.Server.Implementations.Channels
_libraryManager.CreateItem(item, null); _libraryManager.CreateItem(item, null);
} }
await item.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) await item.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
ForceSave = !isNew && forceUpdate ForceSave = !isNew && forceUpdate
}, cancellationToken); }, cancellationToken);
@ -1156,7 +1156,7 @@ namespace Emby.Server.Implementations.Channels
if (isNew || forceUpdate || item.DateLastRefreshed == default(DateTime)) if (isNew || forceUpdate || item.DateLastRefreshed == default(DateTime))
{ {
_providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), RefreshPriority.Normal); _providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), RefreshPriority.Normal);
} }
return item; return item;

View file

@ -149,7 +149,7 @@ namespace Emby.Server.Implementations.Collections
if (options.ItemIdList.Length > 0) if (options.ItemIdList.Length > 0)
{ {
AddToCollection(collection.Id, options.ItemIdList, false, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) AddToCollection(collection.Id, options.ItemIdList, false, new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
// The initial adding of items is going to create a local metadata file // The initial adding of items is going to create a local metadata file
// This will cause internet metadata to be skipped as a result // This will cause internet metadata to be skipped as a result
@ -158,7 +158,7 @@ namespace Emby.Server.Implementations.Collections
} }
else else
{ {
_providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), RefreshPriority.High); _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), RefreshPriority.High);
} }
CollectionCreated?.Invoke(this, new CollectionCreatedEventArgs CollectionCreated?.Invoke(this, new CollectionCreatedEventArgs
@ -178,12 +178,12 @@ namespace Emby.Server.Implementations.Collections
public void AddToCollection(Guid collectionId, IEnumerable<string> ids) public void AddToCollection(Guid collectionId, IEnumerable<string> ids)
{ {
AddToCollection(collectionId, ids, true, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))); AddToCollection(collectionId, ids, true, new MetadataRefreshOptions(new DirectoryService(_fileSystem)));
} }
public void AddToCollection(Guid collectionId, IEnumerable<Guid> ids) public void AddToCollection(Guid collectionId, IEnumerable<Guid> ids)
{ {
AddToCollection(collectionId, ids.Select(i => i.ToString("N", CultureInfo.InvariantCulture)), true, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem))); AddToCollection(collectionId, ids.Select(i => i.ToString("N", CultureInfo.InvariantCulture)), true, new MetadataRefreshOptions(new DirectoryService(_fileSystem)));
} }
private void AddToCollection(Guid collectionId, IEnumerable<string> ids, bool fireEvent, MetadataRefreshOptions refreshOptions) private void AddToCollection(Guid collectionId, IEnumerable<string> ids, bool fireEvent, MetadataRefreshOptions refreshOptions)
@ -287,7 +287,7 @@ namespace Emby.Server.Implementations.Collections
} }
collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None);
_providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
ForceSave = true ForceSave = true
}, RefreshPriority.High); }, RefreshPriority.High);

View file

@ -110,8 +110,8 @@ namespace Emby.Server.Implementations.Data
using (var statement = connection.PrepareStatement("replace into userdisplaypreferences (id, userid, client, data) values (@id, @userId, @client, @data)")) using (var statement = connection.PrepareStatement("replace into userdisplaypreferences (id, userid, client, data) values (@id, @userId, @client, @data)"))
{ {
statement.TryBind("@id", displayPreferences.Id.ToGuidBlob()); statement.TryBind("@id", new Guid(displayPreferences.Id).ToByteArray());
statement.TryBind("@userId", userId.ToGuidBlob()); statement.TryBind("@userId", userId.ToByteArray());
statement.TryBind("@client", client); statement.TryBind("@client", client);
statement.TryBind("@data", serialized); statement.TryBind("@data", serialized);
@ -170,8 +170,8 @@ namespace Emby.Server.Implementations.Data
{ {
using (var statement = connection.PrepareStatement("select data from userdisplaypreferences where id = @id and userId=@userId and client=@client")) using (var statement = connection.PrepareStatement("select data from userdisplaypreferences where id = @id and userId=@userId and client=@client"))
{ {
statement.TryBind("@id", guidId.ToGuidBlob()); statement.TryBind("@id", guidId.ToByteArray());
statement.TryBind("@userId", userId.ToGuidBlob()); statement.TryBind("@userId", userId.ToByteArray());
statement.TryBind("@client", client); statement.TryBind("@client", client);
foreach (var row in statement.ExecuteQuery()) foreach (var row in statement.ExecuteQuery())
@ -200,7 +200,7 @@ namespace Emby.Server.Implementations.Data
using (var connection = GetConnection(true)) using (var connection = GetConnection(true))
using (var statement = connection.PrepareStatement("select data from userdisplaypreferences where userId=@userId")) using (var statement = connection.PrepareStatement("select data from userdisplaypreferences where userId=@userId"))
{ {
statement.TryBind("@userId", userId.ToGuidBlob()); statement.TryBind("@userId", userId.ToByteArray());
foreach (var row in statement.ExecuteQuery()) foreach (var row in statement.ExecuteQuery())
{ {

View file

@ -9,6 +9,47 @@ namespace Emby.Server.Implementations.Data
{ {
public static class SqliteExtensions public static class SqliteExtensions
{ {
private const string DatetimeFormatUtc = "yyyy-MM-dd HH:mm:ss.FFFFFFFK";
private const string DatetimeFormatLocal = "yyyy-MM-dd HH:mm:ss.FFFFFFF";
/// <summary>
/// An array of ISO-8601 DateTime formats that we support parsing.
/// </summary>
private static readonly string[] _datetimeFormats = new string[]
{
"THHmmssK",
"THHmmK",
"HH:mm:ss.FFFFFFFK",
"HH:mm:ssK",
"HH:mmK",
DatetimeFormatUtc,
"yyyy-MM-dd HH:mm:ssK",
"yyyy-MM-dd HH:mmK",
"yyyy-MM-ddTHH:mm:ss.FFFFFFFK",
"yyyy-MM-ddTHH:mmK",
"yyyy-MM-ddTHH:mm:ssK",
"yyyyMMddHHmmssK",
"yyyyMMddHHmmK",
"yyyyMMddTHHmmssFFFFFFFK",
"THHmmss",
"THHmm",
"HH:mm:ss.FFFFFFF",
"HH:mm:ss",
"HH:mm",
DatetimeFormatLocal,
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd HH:mm",
"yyyy-MM-ddTHH:mm:ss.FFFFFFF",
"yyyy-MM-ddTHH:mm",
"yyyy-MM-ddTHH:mm:ss",
"yyyyMMddHHmmss",
"yyyyMMddHHmm",
"yyyyMMddTHHmmssFFFFFFF",
"yyyy-MM-dd",
"yyyyMMdd",
"yy-MM-dd"
};
public static void RunQueries(this SQLiteDatabaseConnection connection, string[] queries) public static void RunQueries(this SQLiteDatabaseConnection connection, string[] queries)
{ {
if (queries == null) if (queries == null)
@ -22,16 +63,6 @@ namespace Emby.Server.Implementations.Data
}); });
} }
public static byte[] ToGuidBlob(this string str)
{
return ToGuidBlob(new Guid(str));
}
public static byte[] ToGuidBlob(this Guid guid)
{
return guid.ToByteArray();
}
public static Guid ReadGuidFromBlob(this IResultSetValue result) public static Guid ReadGuidFromBlob(this IResultSetValue result)
{ {
return new Guid(result.ToBlob()); return new Guid(result.ToBlob());
@ -50,58 +81,16 @@ namespace Emby.Server.Implementations.Data
CultureInfo.InvariantCulture); CultureInfo.InvariantCulture);
} }
private static string GetDateTimeKindFormat( private static string GetDateTimeKindFormat(DateTimeKind kind)
DateTimeKind kind) => (kind == DateTimeKind.Utc) ? DatetimeFormatUtc : DatetimeFormatLocal;
{
return (kind == DateTimeKind.Utc) ? _datetimeFormatUtc : _datetimeFormatLocal;
}
/// <summary>
/// An array of ISO-8601 DateTime formats that we support parsing.
/// </summary>
private static string[] _datetimeFormats = new string[] {
"THHmmssK",
"THHmmK",
"HH:mm:ss.FFFFFFFK",
"HH:mm:ssK",
"HH:mmK",
"yyyy-MM-dd HH:mm:ss.FFFFFFFK", /* NOTE: UTC default (5). */
"yyyy-MM-dd HH:mm:ssK",
"yyyy-MM-dd HH:mmK",
"yyyy-MM-ddTHH:mm:ss.FFFFFFFK",
"yyyy-MM-ddTHH:mmK",
"yyyy-MM-ddTHH:mm:ssK",
"yyyyMMddHHmmssK",
"yyyyMMddHHmmK",
"yyyyMMddTHHmmssFFFFFFFK",
"THHmmss",
"THHmm",
"HH:mm:ss.FFFFFFF",
"HH:mm:ss",
"HH:mm",
"yyyy-MM-dd HH:mm:ss.FFFFFFF", /* NOTE: Non-UTC default (19). */
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd HH:mm",
"yyyy-MM-ddTHH:mm:ss.FFFFFFF",
"yyyy-MM-ddTHH:mm",
"yyyy-MM-ddTHH:mm:ss",
"yyyyMMddHHmmss",
"yyyyMMddHHmm",
"yyyyMMddTHHmmssFFFFFFF",
"yyyy-MM-dd",
"yyyyMMdd",
"yy-MM-dd"
};
private static string _datetimeFormatUtc = _datetimeFormats[5];
private static string _datetimeFormatLocal = _datetimeFormats[19];
public static DateTime ReadDateTime(this IResultSetValue result) public static DateTime ReadDateTime(this IResultSetValue result)
{ {
var dateText = result.ToString(); var dateText = result.ToString();
return DateTime.ParseExact( return DateTime.ParseExact(
dateText, _datetimeFormats, dateText,
_datetimeFormats,
DateTimeFormatInfo.InvariantInfo, DateTimeFormatInfo.InvariantInfo,
DateTimeStyles.None).ToUniversalTime(); DateTimeStyles.None).ToUniversalTime();
} }
@ -139,7 +128,10 @@ namespace Emby.Server.Implementations.Data
public static void Attach(SQLiteDatabaseConnection db, string path, string alias) public static void Attach(SQLiteDatabaseConnection db, string path, string alias)
{ {
var commandText = string.Format("attach @path as {0};", alias); var commandText = string.Format(
CultureInfo.InvariantCulture,
"attach @path as {0};",
alias);
using (var statement = db.PrepareStatement(commandText)) using (var statement = db.PrepareStatement(commandText))
{ {
@ -186,10 +178,7 @@ namespace Emby.Server.Implementations.Data
private static void CheckName(string name) private static void CheckName(string name)
{ {
#if DEBUG #if DEBUG
//if (!name.IndexOf("@", StringComparison.OrdinalIgnoreCase) != 0) throw new ArgumentException("Invalid param name: " + name, nameof(name));
{
throw new Exception("Invalid param name: " + name);
}
#endif #endif
} }
@ -264,7 +253,7 @@ namespace Emby.Server.Implementations.Data
{ {
if (statement.BindParameters.TryGetValue(name, out IBindParameter bindParam)) if (statement.BindParameters.TryGetValue(name, out IBindParameter bindParam))
{ {
bindParam.Bind(value.ToGuidBlob()); bindParam.Bind(value.ToByteArray());
} }
else else
{ {
@ -392,8 +381,7 @@ namespace Emby.Server.Implementations.Data
} }
} }
public static IEnumerable<IReadOnlyList<IResultSetValue>> ExecuteQuery( public static IEnumerable<IReadOnlyList<IResultSetValue>> ExecuteQuery(this IStatement This)
this IStatement This)
{ {
while (This.MoveNext()) while (This.MoveNext())
{ {

View file

@ -549,7 +549,7 @@ namespace Emby.Server.Implementations.Data
{ {
using (var saveImagesStatement = base.PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id")) using (var saveImagesStatement = base.PrepareStatement(db, "Update TypedBaseItems set Images=@Images where guid=@Id"))
{ {
saveImagesStatement.TryBind("@Id", item.Id.ToGuidBlob()); saveImagesStatement.TryBind("@Id", item.Id.ToByteArray());
saveImagesStatement.TryBind("@Images", SerializeImages(item)); saveImagesStatement.TryBind("@Images", SerializeImages(item));
saveImagesStatement.MoveNext(); saveImagesStatement.MoveNext();
@ -1989,7 +1989,7 @@ namespace Emby.Server.Implementations.Data
throw new ArgumentNullException(nameof(chapters)); throw new ArgumentNullException(nameof(chapters));
} }
var idBlob = id.ToGuidBlob(); var idBlob = id.ToByteArray();
using (var connection = GetConnection()) using (var connection = GetConnection())
{ {
@ -3768,7 +3768,7 @@ namespace Emby.Server.Implementations.Data
if (statement != null) if (statement != null)
{ {
statement.TryBind(paramName, personId.ToGuidBlob()); statement.TryBind(paramName, personId.ToByteArray());
} }
index++; index++;
} }
@ -3979,7 +3979,7 @@ namespace Emby.Server.Implementations.Data
clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type<=1))"); clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type<=1))");
if (statement != null) if (statement != null)
{ {
statement.TryBind(paramName, artistId.ToGuidBlob()); statement.TryBind(paramName, artistId.ToByteArray());
} }
index++; index++;
} }
@ -3998,7 +3998,7 @@ namespace Emby.Server.Implementations.Data
clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type=1))"); clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type=1))");
if (statement != null) if (statement != null)
{ {
statement.TryBind(paramName, artistId.ToGuidBlob()); statement.TryBind(paramName, artistId.ToByteArray());
} }
index++; index++;
} }
@ -4017,7 +4017,7 @@ namespace Emby.Server.Implementations.Data
clauses.Add("((select CleanName from TypedBaseItems where guid=" + paramName + ") in (select CleanValue from itemvalues where ItemId=Guid and Type=0) AND (select CleanName from TypedBaseItems where guid=" + paramName + ") not in (select CleanValue from itemvalues where ItemId=Guid and Type=1))"); clauses.Add("((select CleanName from TypedBaseItems where guid=" + paramName + ") in (select CleanValue from itemvalues where ItemId=Guid and Type=0) AND (select CleanName from TypedBaseItems where guid=" + paramName + ") not in (select CleanValue from itemvalues where ItemId=Guid and Type=1))");
if (statement != null) if (statement != null)
{ {
statement.TryBind(paramName, artistId.ToGuidBlob()); statement.TryBind(paramName, artistId.ToByteArray());
} }
index++; index++;
} }
@ -4036,7 +4036,7 @@ namespace Emby.Server.Implementations.Data
clauses.Add("Album in (select Name from typedbaseitems where guid=" + paramName + ")"); clauses.Add("Album in (select Name from typedbaseitems where guid=" + paramName + ")");
if (statement != null) if (statement != null)
{ {
statement.TryBind(paramName, albumId.ToGuidBlob()); statement.TryBind(paramName, albumId.ToByteArray());
} }
index++; index++;
} }
@ -4055,7 +4055,7 @@ namespace Emby.Server.Implementations.Data
clauses.Add("(guid not in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type<=1))"); clauses.Add("(guid not in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type<=1))");
if (statement != null) if (statement != null)
{ {
statement.TryBind(paramName, artistId.ToGuidBlob()); statement.TryBind(paramName, artistId.ToByteArray());
} }
index++; index++;
} }
@ -4074,7 +4074,7 @@ namespace Emby.Server.Implementations.Data
clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type=2))"); clauses.Add("(guid in (select itemid from itemvalues where CleanValue = (select CleanName from TypedBaseItems where guid=" + paramName + ") and Type=2))");
if (statement != null) if (statement != null)
{ {
statement.TryBind(paramName, genreId.ToGuidBlob()); statement.TryBind(paramName, genreId.ToByteArray());
} }
index++; index++;
} }
@ -4145,7 +4145,7 @@ namespace Emby.Server.Implementations.Data
if (statement != null) if (statement != null)
{ {
statement.TryBind(paramName, studioId.ToGuidBlob()); statement.TryBind(paramName, studioId.ToByteArray());
} }
index++; index++;
} }
@ -4921,7 +4921,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
{ {
connection.RunInTransaction(db => connection.RunInTransaction(db =>
{ {
var idBlob = id.ToGuidBlob(); var idBlob = id.ToByteArray();
// Delete people // Delete people
ExecuteWithSingleParam(db, "delete from People where ItemId=@Id", idBlob); ExecuteWithSingleParam(db, "delete from People where ItemId=@Id", idBlob);
@ -5040,7 +5040,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
whereClauses.Add("ItemId=@ItemId"); whereClauses.Add("ItemId=@ItemId");
if (statement != null) if (statement != null)
{ {
statement.TryBind("@ItemId", query.ItemId.ToGuidBlob()); statement.TryBind("@ItemId", query.ItemId.ToByteArray());
} }
} }
if (!query.AppearsInItemId.Equals(Guid.Empty)) if (!query.AppearsInItemId.Equals(Guid.Empty))
@ -5048,7 +5048,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
whereClauses.Add("Name in (Select Name from People where ItemId=@AppearsInItemId)"); whereClauses.Add("Name in (Select Name from People where ItemId=@AppearsInItemId)");
if (statement != null) if (statement != null)
{ {
statement.TryBind("@AppearsInItemId", query.AppearsInItemId.ToGuidBlob()); statement.TryBind("@AppearsInItemId", query.AppearsInItemId.ToByteArray());
} }
} }
var queryPersonTypes = query.PersonTypes.Where(IsValidPersonType).ToList(); var queryPersonTypes = query.PersonTypes.Where(IsValidPersonType).ToList();
@ -5117,7 +5117,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
CheckDisposed(); CheckDisposed();
var itemIdBlob = itemId.ToGuidBlob(); var itemIdBlob = itemId.ToByteArray();
// First delete // First delete
deleteAncestorsStatement.Reset(); deleteAncestorsStatement.Reset();
@ -5151,7 +5151,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
var ancestorId = ancestorIds[i]; var ancestorId = ancestorIds[i];
statement.TryBind("@AncestorId" + index, ancestorId.ToGuidBlob()); statement.TryBind("@AncestorId" + index, ancestorId.ToByteArray());
statement.TryBind("@AncestorIdText" + index, ancestorId.ToString("N", CultureInfo.InvariantCulture)); statement.TryBind("@AncestorIdText" + index, ancestorId.ToString("N", CultureInfo.InvariantCulture));
} }
@ -5616,7 +5616,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
CheckDisposed(); CheckDisposed();
var guidBlob = itemId.ToGuidBlob(); var guidBlob = itemId.ToByteArray();
// First delete // First delete
db.Execute("delete from ItemValues where ItemId=@Id", guidBlob); db.Execute("delete from ItemValues where ItemId=@Id", guidBlob);
@ -5640,10 +5640,13 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
{ {
if (isSubsequentRow) if (isSubsequentRow)
{ {
insertText.Append(","); insertText.Append(',');
} }
insertText.AppendFormat("(@ItemId, @Type{0}, @Value{0}, @CleanValue{0})", i.ToString(CultureInfo.InvariantCulture)); insertText.AppendFormat(
CultureInfo.InvariantCulture,
"(@ItemId, @Type{0}, @Value{0}, @CleanValue{0})",
i);
isSubsequentRow = true; isSubsequentRow = true;
} }
@ -5696,7 +5699,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
{ {
connection.RunInTransaction(db => connection.RunInTransaction(db =>
{ {
var itemIdBlob = itemId.ToGuidBlob(); var itemIdBlob = itemId.ToByteArray();
// First delete chapters // First delete chapters
db.Execute("delete from People where ItemId=@ItemId", itemIdBlob); db.Execute("delete from People where ItemId=@ItemId", itemIdBlob);
@ -5815,7 +5818,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
using (var statement = PrepareStatement(connection, cmdText)) using (var statement = PrepareStatement(connection, cmdText))
{ {
statement.TryBind("@ItemId", query.ItemId.ToGuidBlob()); statement.TryBind("@ItemId", query.ItemId.ToByteArray());
if (query.Type.HasValue) if (query.Type.HasValue)
{ {
@ -5857,7 +5860,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
{ {
connection.RunInTransaction(db => connection.RunInTransaction(db =>
{ {
var itemIdBlob = id.ToGuidBlob(); var itemIdBlob = id.ToByteArray();
// First delete chapters // First delete chapters
db.Execute("delete from mediastreams where ItemId=@ItemId", itemIdBlob); db.Execute("delete from mediastreams where ItemId=@ItemId", itemIdBlob);

View file

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Threading; using System.Threading;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
@ -15,23 +14,19 @@ namespace Emby.Server.Implementations.Data
public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository public class SqliteUserDataRepository : BaseSqliteRepository, IUserDataRepository
{ {
public SqliteUserDataRepository( public SqliteUserDataRepository(
ILoggerFactory loggerFactory, ILogger<SqliteUserDataRepository> logger,
IApplicationPaths appPaths) IApplicationPaths appPaths)
: base(loggerFactory.CreateLogger(nameof(SqliteUserDataRepository))) : base(logger)
{ {
DbFilePath = Path.Combine(appPaths.DataPath, "library.db"); DbFilePath = Path.Combine(appPaths.DataPath, "library.db");
} }
/// <summary> /// <inheritdoc />
/// Gets the name of the repository
/// </summary>
/// <value>The name.</value>
public string Name => "SQLite"; public string Name => "SQLite";
/// <summary> /// <summary>
/// Opens the connection to the database /// Opens the connection to the database.
/// </summary> /// </summary>
/// <returns>Task.</returns>
public void Initialize(IUserManager userManager, SemaphoreSlim dbLock, SQLiteDatabaseConnection dbConnection) public void Initialize(IUserManager userManager, SemaphoreSlim dbLock, SQLiteDatabaseConnection dbConnection)
{ {
WriteLock.Dispose(); WriteLock.Dispose();
@ -97,7 +92,7 @@ namespace Emby.Server.Implementations.Data
continue; continue;
} }
statement.TryBind("@UserId", user.Id.ToGuidBlob()); statement.TryBind("@UserId", user.Id.ToByteArray());
statement.TryBind("@InternalUserId", user.InternalId); statement.TryBind("@InternalUserId", user.InternalId);
statement.MoveNext(); statement.MoveNext();

View file

@ -116,7 +116,7 @@ namespace Emby.Server.Implementations.Data
{ {
using (var statement = db.PrepareStatement("insert into LocalUsersv2 (guid, data) values (@guid, @data)")) using (var statement = db.PrepareStatement("insert into LocalUsersv2 (guid, data) values (@guid, @data)"))
{ {
statement.TryBind("@guid", user.Id.ToGuidBlob()); statement.TryBind("@guid", user.Id.ToByteArray());
statement.TryBind("@data", serialized); statement.TryBind("@data", serialized);
statement.MoveNext(); statement.MoveNext();

View file

@ -54,7 +54,7 @@ namespace Emby.Server.Implementations.EntryPoints
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
await user.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), cancellationToken).ConfigureAwait(false); await user.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)), cancellationToken).ConfigureAwait(false);
} }
} }

View file

@ -1,7 +1,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Controller.Authentication; using MediaBrowser.Controller.Authentication;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Net;
namespace Emby.Server.Implementations.Library namespace Emby.Server.Implementations.Library
{ {

View file

@ -519,7 +519,7 @@ namespace Emby.Server.Implementations.Library
} }
public BaseItem ResolvePath(FileSystemMetadata fileInfo, Folder parent = null) public BaseItem ResolvePath(FileSystemMetadata fileInfo, Folder parent = null)
=> ResolvePath(fileInfo, new DirectoryService(_logger, _fileSystem), null, parent); => ResolvePath(fileInfo, new DirectoryService(_fileSystem), null, parent);
private BaseItem ResolvePath( private BaseItem ResolvePath(
FileSystemMetadata fileInfo, FileSystemMetadata fileInfo,
@ -1045,7 +1045,7 @@ namespace Emby.Server.Implementations.Library
await RootFolder.ValidateChildren( await RootFolder.ValidateChildren(
new SimpleProgress<double>(), new SimpleProgress<double>(),
cancellationToken, cancellationToken,
new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), new MetadataRefreshOptions(new DirectoryService(_fileSystem)),
recursive: false).ConfigureAwait(false); recursive: false).ConfigureAwait(false);
await GetUserRootFolder().RefreshMetadata(cancellationToken).ConfigureAwait(false); await GetUserRootFolder().RefreshMetadata(cancellationToken).ConfigureAwait(false);
@ -1053,7 +1053,7 @@ namespace Emby.Server.Implementations.Library
await GetUserRootFolder().ValidateChildren( await GetUserRootFolder().ValidateChildren(
new SimpleProgress<double>(), new SimpleProgress<double>(),
cancellationToken, cancellationToken,
new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), new MetadataRefreshOptions(new DirectoryService(_fileSystem)),
recursive: false).ConfigureAwait(false); recursive: false).ConfigureAwait(false);
// Quickly scan CollectionFolders for changes // Quickly scan CollectionFolders for changes
@ -1074,7 +1074,7 @@ namespace Emby.Server.Implementations.Library
innerProgress.RegisterAction(pct => progress.Report(pct * .96)); innerProgress.RegisterAction(pct => progress.Report(pct * .96));
// Now validate the entire media library // Now validate the entire media library
await RootFolder.ValidateChildren(innerProgress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), recursive: true).ConfigureAwait(false); await RootFolder.ValidateChildren(innerProgress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), recursive: true).ConfigureAwait(false);
progress.Report(96); progress.Report(96);
@ -2135,7 +2135,7 @@ namespace Emby.Server.Implementations.Library
if (refresh) if (refresh)
{ {
item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None);
_providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), RefreshPriority.Normal); _providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), RefreshPriority.Normal);
} }
return item; return item;
@ -2193,7 +2193,7 @@ namespace Emby.Server.Implementations.Library
{ {
_providerManagerFactory().QueueRefresh( _providerManagerFactory().QueueRefresh(
item.Id, item.Id,
new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
// Need to force save to increment DateLastSaved // Need to force save to increment DateLastSaved
ForceSave = true ForceSave = true
@ -2261,7 +2261,7 @@ namespace Emby.Server.Implementations.Library
{ {
_providerManagerFactory().QueueRefresh( _providerManagerFactory().QueueRefresh(
item.Id, item.Id,
new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
// Need to force save to increment DateLastSaved // Need to force save to increment DateLastSaved
ForceSave = true ForceSave = true
@ -2338,7 +2338,7 @@ namespace Emby.Server.Implementations.Library
{ {
_providerManagerFactory().QueueRefresh( _providerManagerFactory().QueueRefresh(
item.Id, item.Id,
new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
// Need to force save to increment DateLastSaved // Need to force save to increment DateLastSaved
ForceSave = true ForceSave = true

View file

@ -134,12 +134,13 @@ namespace Emby.Server.Implementations.Library
if (allowMediaProbe && mediaSources[0].Type != MediaSourceType.Placeholder && !mediaSources[0].MediaStreams.Any(i => i.Type == MediaStreamType.Audio || i.Type == MediaStreamType.Video)) if (allowMediaProbe && mediaSources[0].Type != MediaSourceType.Placeholder && !mediaSources[0].MediaStreams.Any(i => i.Type == MediaStreamType.Audio || i.Type == MediaStreamType.Video))
{ {
await item.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) await item.RefreshMetadata(
{ new MetadataRefreshOptions(new DirectoryService(_fileSystem))
EnableRemoteContentProbe = true, {
MetadataRefreshMode = MediaBrowser.Controller.Providers.MetadataRefreshMode.FullRefresh EnableRemoteContentProbe = true,
MetadataRefreshMode = MetadataRefreshMode.FullRefresh
}, cancellationToken).ConfigureAwait(false); },
cancellationToken).ConfigureAwait(false);
mediaSources = GetStaticMediaSources(item, enablePathSubstitution, user); mediaSources = GetStaticMediaSources(item, enablePathSubstitution, user);
} }

View file

@ -639,7 +639,7 @@ namespace Emby.Server.Implementations.Library
{ {
foreach (var user in Users) foreach (var user in Users)
{ {
await user.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), cancellationToken).ConfigureAwait(false); await user.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)), cancellationToken).ConfigureAwait(false);
} }
} }

View file

@ -11,16 +11,17 @@ using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Library.Validators namespace Emby.Server.Implementations.Library.Validators
{ {
/// <summary> /// <summary>
/// Class PeopleValidator /// Class PeopleValidator.
/// </summary> /// </summary>
public class PeopleValidator public class PeopleValidator
{ {
/// <summary> /// <summary>
/// The _library manager /// The _library manager.
/// </summary> /// </summary>
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
/// <summary> /// <summary>
/// The _logger /// The _logger.
/// </summary> /// </summary>
private readonly ILogger _logger; private readonly ILogger _logger;
@ -62,7 +63,7 @@ namespace Emby.Server.Implementations.Library.Validators
{ {
var item = _libraryManager.GetPerson(person); var item = _libraryManager.GetPerson(person);
var options = new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) var options = new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
ImageRefreshMode = MetadataRefreshMode.ValidationOnly, ImageRefreshMode = MetadataRefreshMode.ValidationOnly,
MetadataRefreshMode = MetadataRefreshMode.ValidationOnly MetadataRefreshMode = MetadataRefreshMode.ValidationOnly
@ -96,12 +97,19 @@ namespace Emby.Server.Implementations.Library.Validators
foreach (var item in deadEntities) foreach (var item in deadEntities)
{ {
_logger.LogInformation("Deleting dead {2} {0} {1}.", item.Id.ToString("N", CultureInfo.InvariantCulture), item.Name, item.GetType().Name); _logger.LogInformation(
"Deleting dead {2} {0} {1}.",
item.Id.ToString("N", CultureInfo.InvariantCulture),
item.Name,
item.GetType().Name);
_libraryManager.DeleteItem(item, new DeleteOptions _libraryManager.DeleteItem(
{ item,
DeleteFileLocation = false new DeleteOptions
}, false); {
DeleteFileLocation = false
},
false);
} }
progress.Report(100); progress.Report(100);

View file

@ -1489,16 +1489,18 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{ {
_logger.LogInformation("Refreshing recording parent {path}", item.Path); _logger.LogInformation("Refreshing recording parent {path}", item.Path);
_providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) _providerManager.QueueRefresh(
{ item.Id,
RefreshPaths = new string[] new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
path, RefreshPaths = new string[]
Path.GetDirectoryName(path), {
Path.GetDirectoryName(Path.GetDirectoryName(path)) path,
} Path.GetDirectoryName(path),
Path.GetDirectoryName(Path.GetDirectoryName(path))
}, RefreshPriority.High); }
},
RefreshPriority.High);
} }
} }

View file

@ -1226,12 +1226,13 @@ namespace Emby.Server.Implementations.LiveTv
currentChannel.AddTag("Kids"); currentChannel.AddTag("Kids");
} }
//currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken); currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken);
await currentChannel.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) await currentChannel.RefreshMetadata(
{ new MetadataRefreshOptions(new DirectoryService(_fileSystem))
ForceSave = true {
ForceSave = true
}, cancellationToken).ConfigureAwait(false); },
cancellationToken).ConfigureAwait(false);
} }
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
@ -1245,7 +1246,7 @@ namespace Emby.Server.Implementations.LiveTv
numComplete++; numComplete++;
double percent = numComplete / (double)allChannelsList.Count; double percent = numComplete / (double)allChannelsList.Count;
progress.Report(85 * percent + 15); progress.Report((85 * percent) + 15);
} }
progress.Report(100); progress.Report(100);
@ -1278,12 +1279,14 @@ namespace Emby.Server.Implementations.LiveTv
if (item != null) if (item != null)
{ {
_libraryManager.DeleteItem(item, new DeleteOptions _libraryManager.DeleteItem(
{ item,
DeleteFileLocation = false, new DeleteOptions
DeleteFromExternalProvider = false {
DeleteFileLocation = false,
}, false); DeleteFromExternalProvider = false
},
false);
} }
} }

View file

@ -90,8 +90,7 @@ namespace Emby.Server.Implementations.Playlists
} }
else else
{ {
var folder = item as Folder; if (item is Folder folder)
if (folder != null)
{ {
options.MediaType = folder.GetRecursiveChildren(i => !i.IsFolder && i.SupportsAddingToPlaylist) options.MediaType = folder.GetRecursiveChildren(i => !i.IsFolder && i.SupportsAddingToPlaylist)
.Select(i => i.MediaType) .Select(i => i.MediaType)
@ -140,7 +139,7 @@ namespace Emby.Server.Implementations.Playlists
parentFolder.AddChild(playlist, CancellationToken.None); parentFolder.AddChild(playlist, CancellationToken.None);
await playlist.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) { ForceSave = true }, CancellationToken.None) await playlist.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)) { ForceSave = true }, CancellationToken.None)
.ConfigureAwait(false); .ConfigureAwait(false);
if (options.ItemIdList.Length > 0) if (options.ItemIdList.Length > 0)
@ -201,7 +200,7 @@ namespace Emby.Server.Implementations.Playlists
var list = new List<LinkedChild>(); var list = new List<LinkedChild>();
var items = (GetPlaylistItems(itemIds, playlist.MediaType, user, options)) var items = GetPlaylistItems(itemIds, playlist.MediaType, user, options)
.Where(i => i.SupportsAddingToPlaylist) .Where(i => i.SupportsAddingToPlaylist)
.ToList(); .ToList();
@ -221,18 +220,18 @@ namespace Emby.Server.Implementations.Playlists
SavePlaylistFile(playlist); SavePlaylistFile(playlist);
} }
_providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) _providerManager.QueueRefresh(
{ playlist.Id,
ForceSave = true new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{
}, RefreshPriority.High); ForceSave = true
},
RefreshPriority.High);
} }
public void RemoveFromPlaylist(string playlistId, IEnumerable<string> entryIds) public void RemoveFromPlaylist(string playlistId, IEnumerable<string> entryIds)
{ {
var playlist = _libraryManager.GetItemById(playlistId) as Playlist; if (!(_libraryManager.GetItemById(playlistId) is Playlist playlist))
if (playlist == null)
{ {
throw new ArgumentException("No Playlist exists with the supplied Id"); throw new ArgumentException("No Playlist exists with the supplied Id");
} }
@ -254,7 +253,7 @@ namespace Emby.Server.Implementations.Playlists
SavePlaylistFile(playlist); SavePlaylistFile(playlist);
} }
_providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
ForceSave = true ForceSave = true
@ -263,9 +262,7 @@ namespace Emby.Server.Implementations.Playlists
public void MoveItem(string playlistId, string entryId, int newIndex) public void MoveItem(string playlistId, string entryId, int newIndex)
{ {
var playlist = _libraryManager.GetItemById(playlistId) as Playlist; if (!(_libraryManager.GetItemById(playlistId) is Playlist playlist))
if (playlist == null)
{ {
throw new ArgumentException("No Playlist exists with the supplied Id"); throw new ArgumentException("No Playlist exists with the supplied Id");
} }

View file

@ -19,16 +19,17 @@ using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.ScheduledTasks namespace Emby.Server.Implementations.ScheduledTasks
{ {
/// <summary> /// <summary>
/// Class ChapterImagesTask /// Class ChapterImagesTask.
/// </summary> /// </summary>
public class ChapterImagesTask : IScheduledTask public class ChapterImagesTask : IScheduledTask
{ {
/// <summary> /// <summary>
/// The _logger /// The _logger.
/// </summary> /// </summary>
private readonly ILogger _logger; private readonly ILogger _logger;
/// <summary> /// <summary>
/// The _library manager /// The _library manager.
/// </summary> /// </summary>
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
@ -53,12 +54,12 @@ namespace Emby.Server.Implementations.ScheduledTasks
} }
/// <summary> /// <summary>
/// Creates the triggers that define when the task will run /// Creates the triggers that define when the task will run.
/// </summary> /// </summary>
public IEnumerable<TaskTriggerInfo> GetDefaultTriggers() public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
{ {
return new[] { return new[]
{
new TaskTriggerInfo new TaskTriggerInfo
{ {
Type = TaskTriggerInfo.TriggerDaily, Type = TaskTriggerInfo.TriggerDaily,
@ -117,7 +118,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
previouslyFailedImages = new List<string>(); previouslyFailedImages = new List<string>();
} }
var directoryService = new DirectoryService(_logger, _fileSystem); var directoryService = new DirectoryService(_fileSystem);
foreach (var video in videos) foreach (var video in videos)
{ {

View file

@ -1,11 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Concurrent;
using System.IO; using System.IO;
using System.Xml; using System.Xml;
using System.Xml.Serialization; using System.Xml.Serialization;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Serialization;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Serialization namespace Emby.Server.Implementations.Serialization
{ {
@ -14,35 +12,13 @@ namespace Emby.Server.Implementations.Serialization
/// </summary> /// </summary>
public class MyXmlSerializer : IXmlSerializer public class MyXmlSerializer : IXmlSerializer
{ {
private readonly IFileSystem _fileSystem;
private readonly ILogger _logger;
public MyXmlSerializer(
IFileSystem fileSystem,
ILoggerFactory loggerFactory)
{
_fileSystem = fileSystem;
_logger = loggerFactory.CreateLogger("XmlSerializer");
}
// Need to cache these // Need to cache these
// http://dotnetcodebox.blogspot.com/2013/01/xmlserializer-class-may-result-in.html // http://dotnetcodebox.blogspot.com/2013/01/xmlserializer-class-may-result-in.html
private readonly Dictionary<string, XmlSerializer> _serializers = private static readonly ConcurrentDictionary<string, XmlSerializer> _serializers =
new Dictionary<string, XmlSerializer>(); new ConcurrentDictionary<string, XmlSerializer>();
private XmlSerializer GetSerializer(Type type) private static XmlSerializer GetSerializer(Type type)
{ => _serializers.GetOrAdd(type.FullName, _ => new XmlSerializer(type));
var key = type.FullName;
lock (_serializers)
{
if (!_serializers.TryGetValue(key, out var serializer))
{
serializer = new XmlSerializer(type);
_serializers[key] = serializer;
}
return serializer;
}
}
/// <summary> /// <summary>
/// Serializes to writer. /// Serializes to writer.
@ -91,7 +67,6 @@ namespace Emby.Server.Implementations.Serialization
/// <param name="file">The file.</param> /// <param name="file">The file.</param>
public void SerializeToFile(object obj, string file) public void SerializeToFile(object obj, string file)
{ {
_logger.LogDebug("Serializing to file {0}", file);
using (var stream = new FileStream(file, FileMode.Create)) using (var stream = new FileStream(file, FileMode.Create))
{ {
SerializeToStream(obj, stream); SerializeToStream(obj, stream);
@ -106,7 +81,6 @@ namespace Emby.Server.Implementations.Serialization
/// <returns>System.Object.</returns> /// <returns>System.Object.</returns>
public object DeserializeFromFile(Type type, string file) public object DeserializeFromFile(Type type, string file)
{ {
_logger.LogDebug("Deserializing file {0}", file);
using (var stream = File.OpenRead(file)) using (var stream = File.OpenRead(file))
{ {
return DeserializeFromStream(type, stream); return DeserializeFromStream(type, stream);

View file

@ -6,7 +6,7 @@ using MediaBrowser.Controller;
namespace Emby.Server.Implementations namespace Emby.Server.Implementations
{ {
/// <summary> /// <summary>
/// Extends BaseApplicationPaths to add paths that are only applicable on the server /// Extends BaseApplicationPaths to add paths that are only applicable on the server.
/// </summary> /// </summary>
public class ServerApplicationPaths : BaseApplicationPaths, IServerApplicationPaths public class ServerApplicationPaths : BaseApplicationPaths, IServerApplicationPaths
{ {

View file

@ -32,7 +32,7 @@ namespace MediaBrowser.Api
if (string.IsNullOrEmpty(val)) if (string.IsNullOrEmpty(val))
{ {
return new ItemFields[] { }; return Array.Empty<ItemFields>();
} }
return val.Split(',').Select(v => return val.Split(',').Select(v =>
@ -41,6 +41,7 @@ namespace MediaBrowser.Api
{ {
return (ItemFields?)value; return (ItemFields?)value;
} }
return null; return null;
}).Where(i => i.HasValue).Select(i => i.Value).ToArray(); }).Where(i => i.HasValue).Select(i => i.Value).ToArray();

View file

@ -227,15 +227,17 @@ namespace MediaBrowser.Api
//item.ProductionYear = request.ProductionYear; //item.ProductionYear = request.ProductionYear;
//item.Name = request.Name; //item.Name = request.Name;
return _providerManager.RefreshFullItem(item, new MetadataRefreshOptions(new DirectoryService(Logger, _fileSystem)) return _providerManager.RefreshFullItem(
{ item,
MetadataRefreshMode = MetadataRefreshMode.FullRefresh, new MetadataRefreshOptions(new DirectoryService(_fileSystem))
ImageRefreshMode = MetadataRefreshMode.FullRefresh, {
ReplaceAllMetadata = true, MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
ReplaceAllImages = request.ReplaceAllImages, ImageRefreshMode = MetadataRefreshMode.FullRefresh,
SearchResult = request ReplaceAllMetadata = true,
ReplaceAllImages = request.ReplaceAllImages,
}, CancellationToken.None); SearchResult = request
},
CancellationToken.None);
} }
/// <summary> /// <summary>
@ -294,11 +296,9 @@ namespace MediaBrowser.Api
Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath)); Directory.CreateDirectory(Path.GetDirectoryName(fullCachePath));
using (var stream = result.Content) using (var stream = result.Content)
using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
{ {
using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) await stream.CopyToAsync(filestream).ConfigureAwait(false);
{
await stream.CopyToAsync(filestream).ConfigureAwait(false);
}
} }
Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath)); Directory.CreateDirectory(Path.GetDirectoryName(pointerCachePath));
@ -311,9 +311,6 @@ namespace MediaBrowser.Api
/// <param name="filename">The filename.</param> /// <param name="filename">The filename.</param>
/// <returns>System.String.</returns> /// <returns>System.String.</returns>
private string GetFullCachePath(string filename) private string GetFullCachePath(string filename)
{ => Path.Combine(_appPaths.CachePath, "remote-images", filename.Substring(0, 1), filename);
return Path.Combine(_appPaths.CachePath, "remote-images", filename.Substring(0, 1), filename);
}
} }
} }

View file

@ -63,7 +63,7 @@ namespace MediaBrowser.Api
private MetadataRefreshOptions GetRefreshOptions(RefreshItem request) private MetadataRefreshOptions GetRefreshOptions(RefreshItem request)
{ {
return new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)) return new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
MetadataRefreshMode = request.MetadataRefreshMode, MetadataRefreshMode = request.MetadataRefreshMode,
ImageRefreshMode = request.ImageRefreshMode, ImageRefreshMode = request.ImageRefreshMode,

View file

@ -225,13 +225,15 @@ namespace MediaBrowser.Api
if (displayOrderChanged) if (displayOrderChanged)
{ {
_providerManager.QueueRefresh(series.Id, new MetadataRefreshOptions(new DirectoryService(Logger, _fileSystem)) _providerManager.QueueRefresh(
{ series.Id,
MetadataRefreshMode = MetadataRefreshMode.FullRefresh, new MetadataRefreshOptions(new DirectoryService(_fileSystem))
ImageRefreshMode = MetadataRefreshMode.FullRefresh, {
ReplaceAllMetadata = true MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
ImageRefreshMode = MetadataRefreshMode.FullRefresh,
}, RefreshPriority.High); ReplaceAllMetadata = true
},
RefreshPriority.High);
} }
} }

View file

@ -279,13 +279,12 @@ namespace MediaBrowser.Api.Subtitles
await _subtitleManager.DownloadSubtitles(video, request.SubtitleId, CancellationToken.None) await _subtitleManager.DownloadSubtitles(video, request.SubtitleId, CancellationToken.None)
.ConfigureAwait(false); .ConfigureAwait(false);
_providerManager.QueueRefresh(video.Id, new MetadataRefreshOptions(new DirectoryService(Logger, _fileSystem)), RefreshPriority.High); _providerManager.QueueRefresh(video.Id, new MetadataRefreshOptions(new DirectoryService(_fileSystem)), RefreshPriority.High);
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.LogError(ex, "Error downloading subtitles"); Logger.LogError(ex, "Error downloading subtitles");
} }
}); });
} }
} }

View file

@ -413,7 +413,7 @@ namespace MediaBrowser.Api.UserLibrary
if (!hasMetdata) if (!hasMetdata)
{ {
var options = new MetadataRefreshOptions(new DirectoryService(Logger, _fileSystem)) var options = new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{ {
MetadataRefreshMode = MetadataRefreshMode.FullRefresh, MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
ImageRefreshMode = MetadataRefreshMode.FullRefresh, ImageRefreshMode = MetadataRefreshMode.FullRefresh,

View file

@ -124,10 +124,10 @@ namespace MediaBrowser.Common.Cryptography
stringBuilder.Append('$'); stringBuilder.Append('$');
foreach (var pair in _parameters) foreach (var pair in _parameters)
{ {
stringBuilder.Append(pair.Key); stringBuilder.Append(pair.Key)
stringBuilder.Append('='); .Append('=')
stringBuilder.Append(pair.Value); .Append(pair.Value)
stringBuilder.Append(','); .Append(',');
} }
// Remove last ',' // Remove last ','
@ -137,21 +137,19 @@ namespace MediaBrowser.Common.Cryptography
/// <inheritdoc /> /// <inheritdoc />
public override string ToString() public override string ToString()
{ {
var str = new StringBuilder(); var str = new StringBuilder()
str.Append('$'); .Append('$')
str.Append(Id); .Append(Id);
SerializeParameters(str); SerializeParameters(str);
if (Salt.Length != 0) if (Salt.Length != 0)
{ {
str.Append('$'); str.Append('$')
str.Append(ToHexString(Salt)); .Append(ToHexString(Salt));
} }
str.Append('$'); return str.Append('$')
str.Append(ToHexString(Hash)); .Append(ToHexString(Hash)).ToString();
return str.ToString();
} }
} }
} }

View file

@ -89,7 +89,7 @@ namespace MediaBrowser.Controller.Entities
{ {
var locations = PhysicalLocations; var locations = PhysicalLocations;
var newLocations = CreateResolveArgs(new DirectoryService(Logger, FileSystem), false).PhysicalLocations; var newLocations = CreateResolveArgs(new DirectoryService(FileSystem), false).PhysicalLocations;
if (!locations.SequenceEqual(newLocations)) if (!locations.SequenceEqual(newLocations))
{ {

View file

@ -1344,7 +1344,7 @@ namespace MediaBrowser.Controller.Entities
public Task RefreshMetadata(CancellationToken cancellationToken) public Task RefreshMetadata(CancellationToken cancellationToken)
{ {
return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem)), cancellationToken); return RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(FileSystem)), cancellationToken);
} }
protected virtual void TriggerOnRefreshStart() protected virtual void TriggerOnRefreshStart()
@ -2197,7 +2197,7 @@ namespace MediaBrowser.Controller.Entities
/// <returns>Task.</returns> /// <returns>Task.</returns>
public virtual void ChangedExternally() public virtual void ChangedExternally()
{ {
ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem)) ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(new DirectoryService(FileSystem))
{ {
}, RefreshPriority.High); }, RefreshPriority.High);

View file

@ -171,7 +171,7 @@ namespace MediaBrowser.Controller.Entities
{ {
var locations = PhysicalLocations; var locations = PhysicalLocations;
var newLocations = CreateResolveArgs(new DirectoryService(Logger, FileSystem), false).PhysicalLocations; var newLocations = CreateResolveArgs(new DirectoryService(FileSystem), false).PhysicalLocations;
if (!locations.SequenceEqual(newLocations)) if (!locations.SequenceEqual(newLocations))
{ {

View file

@ -216,7 +216,7 @@ namespace MediaBrowser.Controller.Entities
public Task ValidateChildren(IProgress<double> progress, CancellationToken cancellationToken) public Task ValidateChildren(IProgress<double> progress, CancellationToken cancellationToken)
{ {
return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem))); return ValidateChildren(progress, cancellationToken, new MetadataRefreshOptions(new DirectoryService(FileSystem)));
} }
/// <summary> /// <summary>

View file

@ -148,7 +148,7 @@ namespace MediaBrowser.Controller.Entities
Name = newName; Name = newName;
return RefreshMetadata( return RefreshMetadata(
new MetadataRefreshOptions(new DirectoryService(Logger, FileSystem)) new MetadataRefreshOptions(new DirectoryService(FileSystem))
{ {
ReplaceAllMetadata = true, ReplaceAllMetadata = true,
ImageRefreshMode = MetadataRefreshMode.FullRefresh, ImageRefreshMode = MetadataRefreshMode.FullRefresh,

View file

@ -2,13 +2,11 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Providers
{ {
public class DirectoryService : IDirectoryService public class DirectoryService : IDirectoryService
{ {
private readonly ILogger _logger;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly Dictionary<string, FileSystemMetadata[]> _cache = new Dictionary<string, FileSystemMetadata[]>(StringComparer.OrdinalIgnoreCase); private readonly Dictionary<string, FileSystemMetadata[]> _cache = new Dictionary<string, FileSystemMetadata[]>(StringComparer.OrdinalIgnoreCase);
@ -17,9 +15,8 @@ namespace MediaBrowser.Controller.Providers
private readonly Dictionary<string, List<string>> _filePathCache = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase); private readonly Dictionary<string, List<string>> _filePathCache = new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
public DirectoryService(ILogger logger, IFileSystem fileSystem) public DirectoryService(IFileSystem fileSystem)
{ {
_logger = logger;
_fileSystem = fileSystem; _fileSystem = fileSystem;
} }
@ -27,8 +24,6 @@ namespace MediaBrowser.Controller.Providers
{ {
if (!_cache.TryGetValue(path, out FileSystemMetadata[] entries)) if (!_cache.TryGetValue(path, out FileSystemMetadata[] entries))
{ {
//_logger.LogDebug("Getting files for " + path);
entries = _fileSystem.GetFileSystemEntries(path).ToArray(); entries = _fileSystem.GetFileSystemEntries(path).ToArray();
//_cache.TryAdd(path, entries); //_cache.TryAdd(path, entries);
@ -49,6 +44,7 @@ namespace MediaBrowser.Controller.Providers
list.Add(item); list.Add(item);
} }
} }
return list; return list;
} }
@ -89,6 +85,5 @@ namespace MediaBrowser.Controller.Providers
return result; return result;
} }
} }
} }

View file

@ -24,7 +24,8 @@ namespace MediaBrowser.Controller.Subtitles
/// <summary> /// <summary>
/// Searches the subtitles. /// Searches the subtitles.
/// </summary> /// </summary>
Task<RemoteSubtitleInfo[]> SearchSubtitles(Video video, Task<RemoteSubtitleInfo[]> SearchSubtitles(
Video video,
string language, string language,
bool? isPerfectMatch, bool? isPerfectMatch,
CancellationToken cancellationToken); CancellationToken cancellationToken);
@ -34,8 +35,9 @@ namespace MediaBrowser.Controller.Subtitles
/// </summary> /// </summary>
/// <param name="request">The request.</param> /// <param name="request">The request.</param>
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{IEnumerable{RemoteSubtitleInfo}}.</returns> /// <returns>Task{RemoteSubtitleInfo[]}.</returns>
Task<RemoteSubtitleInfo[]> SearchSubtitles(SubtitleSearchRequest request, Task<RemoteSubtitleInfo[]> SearchSubtitles(
SubtitleSearchRequest request,
CancellationToken cancellationToken); CancellationToken cancellationToken);
/// <summary> /// <summary>
@ -53,7 +55,7 @@ namespace MediaBrowser.Controller.Subtitles
/// </summary> /// </summary>
/// <param name="id">The identifier.</param> /// <param name="id">The identifier.</param>
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{SubtitleResponse}.</returns> /// <returns><see cref="Task{SubtitleResponse}" />.</returns>
Task<SubtitleResponse> GetRemoteSubtitles(string id, CancellationToken cancellationToken); Task<SubtitleResponse> GetRemoteSubtitles(string id, CancellationToken cancellationToken);
/// <summary> /// <summary>

View file

@ -1,17 +1,17 @@
namespace MediaBrowser.Model.IO namespace MediaBrowser.Model.IO
{ {
/// <summary> /// <summary>
/// Class StreamDefaults /// Class StreamDefaults.
/// </summary> /// </summary>
public static class StreamDefaults public static class StreamDefaults
{ {
/// <summary> /// <summary>
/// The default copy to buffer size /// The default copy to buffer size.
/// </summary> /// </summary>
public const int DefaultCopyToBufferSize = 81920; public const int DefaultCopyToBufferSize = 81920;
/// <summary> /// <summary>
/// The default file stream buffer size /// The default file stream buffer size.
/// </summary> /// </summary>
public const int DefaultFileStreamBufferSize = 4096; public const int DefaultFileStreamBufferSize = 4096;
} }

View file

@ -16,9 +16,8 @@ namespace MediaBrowser.Providers.Books
ILogger logger, ILogger logger,
IProviderManager providerManager, IProviderManager providerManager,
IFileSystem fileSystem, IFileSystem fileSystem,
IUserDataManager userDataManager,
ILibraryManager libraryManager) ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{ {
} }

View file

@ -11,6 +11,17 @@ namespace MediaBrowser.Providers.Books
{ {
public class BookMetadataService : MetadataService<Book, BookInfo> public class BookMetadataService : MetadataService<Book, BookInfo>
{ {
public BookMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<Book> source, MetadataResult<Book> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Book> source, MetadataResult<Book> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@ -20,9 +31,5 @@ namespace MediaBrowser.Providers.Books
target.Item.SeriesName = source.Item.SeriesName; target.Item.SeriesName = source.Item.SeriesName;
} }
} }
public BookMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -14,11 +14,35 @@ namespace MediaBrowser.Providers.BoxSets
{ {
public class BoxSetMetadataService : MetadataService<BoxSet, BoxSetInfo> public class BoxSetMetadataService : MetadataService<BoxSet, BoxSetInfo>
{ {
public BoxSetMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override bool EnableUpdatingGenresFromChildren => true;
/// <inheritdoc />
protected override bool EnableUpdatingOfficialRatingFromChildren => true;
/// <inheritdoc />
protected override bool EnableUpdatingStudiosFromChildren => true;
/// <inheritdoc />
protected override bool EnableUpdatingPremiereDateFromChildren => true;
/// <inheritdoc />
protected override IList<BaseItem> GetChildrenForMetadataUpdates(BoxSet item) protected override IList<BaseItem> GetChildrenForMetadataUpdates(BoxSet item)
{ {
return item.GetLinkedChildren(); return item.GetLinkedChildren();
} }
/// <inheritdoc />
protected override void MergeData(MetadataResult<BoxSet> source, MetadataResult<BoxSet> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<BoxSet> source, MetadataResult<BoxSet> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@ -32,6 +56,7 @@ namespace MediaBrowser.Providers.BoxSets
} }
} }
/// <inheritdoc />
protected override ItemUpdateType BeforeSaveInternal(BoxSet item, bool isFullRefresh, ItemUpdateType currentUpdateType) protected override ItemUpdateType BeforeSaveInternal(BoxSet item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{ {
var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType); var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType);
@ -47,17 +72,5 @@ namespace MediaBrowser.Providers.BoxSets
return updateType; return updateType;
} }
public BoxSetMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
protected override bool EnableUpdatingGenresFromChildren => true;
protected override bool EnableUpdatingOfficialRatingFromChildren => true;
protected override bool EnableUpdatingStudiosFromChildren => true;
protected override bool EnableUpdatingPremiereDateFromChildren => true;
} }
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Channels
{ {
public class ChannelMetadataService : MetadataService<Channel, ItemLookupInfo> public class ChannelMetadataService : MetadataService<Channel, ItemLookupInfo>
{ {
public ChannelMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<Channel> source, MetadataResult<Channel> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Channel> source, MetadataResult<Channel> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public ChannelMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -12,13 +12,20 @@ namespace MediaBrowser.Providers.Folders
{ {
public class CollectionFolderMetadataService : MetadataService<CollectionFolder, ItemLookupInfo> public class CollectionFolderMetadataService : MetadataService<CollectionFolder, ItemLookupInfo>
{ {
public CollectionFolderMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<CollectionFolder> source, MetadataResult<CollectionFolder> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<CollectionFolder> source, MetadataResult<CollectionFolder> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public CollectionFolderMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -11,16 +11,24 @@ namespace MediaBrowser.Providers.Folders
{ {
public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo> public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo>
{ {
public FolderMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
// Make sure the type-specific services get picked first // Make sure the type-specific services get picked first
public override int Order => 10; public override int Order => 10;
/// <inheritdoc />
protected override void MergeData(MetadataResult<Folder> source, MetadataResult<Folder> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Folder> source, MetadataResult<Folder> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public FolderMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Folders
{ {
public class UserViewMetadataService : MetadataService<UserView, ItemLookupInfo> public class UserViewMetadataService : MetadataService<UserView, ItemLookupInfo>
{ {
public UserViewMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<UserView> source, MetadataResult<UserView> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<UserView> source, MetadataResult<UserView> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public UserViewMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Genres
{ {
public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo> public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo>
{ {
public GenreMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<Genre> source, MetadataResult<Genre> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Genre> source, MetadataResult<Genre> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public GenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.LiveTv
{ {
public class LiveTvMetadataService : MetadataService<LiveTvChannel, ItemLookupInfo> public class LiveTvMetadataService : MetadataService<LiveTvChannel, ItemLookupInfo>
{ {
public LiveTvMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<LiveTvChannel> source, MetadataResult<LiveTvChannel> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<LiveTvChannel> source, MetadataResult<LiveTvChannel> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public LiveTvMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -340,7 +340,7 @@ namespace MediaBrowser.Providers.Manager
if (deleted) if (deleted)
{ {
item.ValidateImages(new DirectoryService(_logger, _fileSystem)); item.ValidateImages(new DirectoryService(_fileSystem));
} }
} }

View file

@ -23,16 +23,14 @@ namespace MediaBrowser.Providers.Manager
protected readonly ILogger Logger; protected readonly ILogger Logger;
protected readonly IProviderManager ProviderManager; protected readonly IProviderManager ProviderManager;
protected readonly IFileSystem FileSystem; protected readonly IFileSystem FileSystem;
protected readonly IUserDataManager UserDataManager;
protected readonly ILibraryManager LibraryManager; protected readonly ILibraryManager LibraryManager;
protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, ILibraryManager libraryManager)
{ {
ServerConfigurationManager = serverConfigurationManager; ServerConfigurationManager = serverConfigurationManager;
Logger = logger; Logger = logger;
ProviderManager = providerManager; ProviderManager = providerManager;
FileSystem = fileSystem; FileSystem = fileSystem;
UserDataManager = userDataManager;
LibraryManager = libraryManager; LibraryManager = libraryManager;
} }
@ -44,7 +42,7 @@ namespace MediaBrowser.Providers.Manager
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.LogError(ex, "Error getting file {path}", path); Logger.LogError(ex, "Error getting file {Path}", path);
return null; return null;
} }
} }

View file

@ -328,7 +328,7 @@ namespace MediaBrowser.Providers.Manager
return GetImageProviders(item, libraryOptions, options, return GetImageProviders(item, libraryOptions, options,
new ImageRefreshOptions( new ImageRefreshOptions(
new DirectoryService(_logger, _fileSystem)), new DirectoryService(_fileSystem)),
includeDisabled) includeDisabled)
.OfType<IRemoteImageProvider>(); .OfType<IRemoteImageProvider>();
} }
@ -507,7 +507,7 @@ namespace MediaBrowser.Providers.Manager
var imageProviders = GetImageProviders(dummy, libraryOptions, options, var imageProviders = GetImageProviders(dummy, libraryOptions, options,
new ImageRefreshOptions( new ImageRefreshOptions(
new DirectoryService(_logger, _fileSystem)), new DirectoryService(_fileSystem)),
true) true)
.ToList(); .ToList();

View file

@ -9,17 +9,20 @@ namespace MediaBrowser.Providers.Movies
{ {
public class ImdbExternalId : IExternalId public class ImdbExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "IMDb"; public string Name => "IMDb";
/// <inheritdoc />
public string Key => MetadataProviders.Imdb.ToString(); public string Key => MetadataProviders.Imdb.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://www.imdb.com/title/{0}"; public string UrlFormatString => "https://www.imdb.com/title/{0}";
/// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ {
// Supports images for tv movies // Supports images for tv movies
var tvProgram = item as LiveTvProgram; if (item is LiveTvProgram tvProgram && tvProgram.IsMovie)
if (tvProgram != null && tvProgram.IsMovie)
{ {
return true; return true;
} }
@ -28,18 +31,18 @@ namespace MediaBrowser.Providers.Movies
} }
} }
public class ImdbPersonExternalId : IExternalId public class ImdbPersonExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "IMDb"; public string Name => "IMDb";
/// <inheritdoc />
public string Key => MetadataProviders.Imdb.ToString(); public string Key => MetadataProviders.Imdb.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://www.imdb.com/name/{0}"; public string UrlFormatString => "https://www.imdb.com/name/{0}";
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is Person;
return item is Person;
}
} }
} }

View file

@ -1,5 +1,4 @@
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
@ -12,6 +11,17 @@ namespace MediaBrowser.Providers.Movies
{ {
public class MovieMetadataService : MetadataService<Movie, MovieInfo> public class MovieMetadataService : MetadataService<Movie, MovieInfo>
{ {
public MovieMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override bool IsFullLocalMetadata(Movie item) protected override bool IsFullLocalMetadata(Movie item)
{ {
if (string.IsNullOrWhiteSpace(item.Overview)) if (string.IsNullOrWhiteSpace(item.Overview))
@ -25,6 +35,7 @@ namespace MediaBrowser.Providers.Movies
return base.IsFullLocalMetadata(item); return base.IsFullLocalMetadata(item);
} }
/// <inheritdoc />
protected override void MergeData(MetadataResult<Movie> source, MetadataResult<Movie> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Movie> source, MetadataResult<Movie> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@ -37,40 +48,5 @@ namespace MediaBrowser.Providers.Movies
targetItem.CollectionName = sourceItem.CollectionName; targetItem.CollectionName = sourceItem.CollectionName;
} }
} }
public MovieMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
public class TrailerMetadataService : MetadataService<Trailer, TrailerInfo>
{
protected override bool IsFullLocalMetadata(Trailer item)
{
if (string.IsNullOrWhiteSpace(item.Overview))
{
return false;
}
if (!item.ProductionYear.HasValue)
{
return false;
}
return base.IsFullLocalMetadata(item);
}
protected override void MergeData(MetadataResult<Trailer> source, MetadataResult<Trailer> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
if (replaceData || target.Item.TrailerTypes.Length == 0)
{
target.Item.TrailerTypes = source.Item.TrailerTypes;
}
}
public TrailerMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
}
} }

View file

@ -0,0 +1,49 @@
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Providers.Manager;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.Providers.Movies
{
public class TrailerMetadataService : MetadataService<Trailer, TrailerInfo>
{
public TrailerMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override bool IsFullLocalMetadata(Trailer item)
{
if (string.IsNullOrWhiteSpace(item.Overview))
{
return false;
}
if (!item.ProductionYear.HasValue)
{
return false;
}
return base.IsFullLocalMetadata(item);
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<Trailer> source, MetadataResult<Trailer> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
if (replaceData || target.Item.TrailerTypes.Length == 0)
{
target.Item.TrailerTypes = source.Item.TrailerTypes;
}
}
}
}

View file

@ -20,9 +20,8 @@ namespace MediaBrowser.Providers.Music
ILogger logger, ILogger logger,
IProviderManager providerManager, IProviderManager providerManager,
IFileSystem fileSystem, IFileSystem fileSystem,
IUserDataManager userDataManager,
ILibraryManager libraryManager) ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{ {
} }
@ -37,10 +36,7 @@ namespace MediaBrowser.Providers.Music
/// <inheritdoc /> /// <inheritdoc />
protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicAlbum item) protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicAlbum item)
{ => item.GetRecursiveChildren(i => i is Audio);
return item.GetRecursiveChildren(i => i is Audio)
.ToList();
}
/// <inheritdoc /> /// <inheritdoc />
protected override ItemUpdateType UpdateMetadataFromChildren(MusicAlbum item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType) protected override ItemUpdateType UpdateMetadataFromChildren(MusicAlbum item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
@ -53,20 +49,18 @@ namespace MediaBrowser.Providers.Music
{ {
var name = children.Select(i => i.Album).FirstOrDefault(i => !string.IsNullOrEmpty(i)); var name = children.Select(i => i.Album).FirstOrDefault(i => !string.IsNullOrEmpty(i));
if (!string.IsNullOrEmpty(name)) if (!string.IsNullOrEmpty(name)
&& !string.Equals(item.Name, name, StringComparison.Ordinal))
{ {
if (!string.Equals(item.Name, name, StringComparison.Ordinal)) item.Name = name;
{ updateType |= ItemUpdateType.MetadataEdit;
item.Name = name;
updateType = updateType | ItemUpdateType.MetadataEdit;
}
} }
} }
var songs = children.Cast<Audio>().ToArray(); var songs = children.Cast<Audio>().ToArray();
updateType = updateType | SetAlbumArtistFromSongs(item, songs); updateType |= SetAlbumArtistFromSongs(item, songs);
updateType = updateType | SetArtistsFromSongs(item, songs); updateType |= SetArtistsFromSongs(item, songs);
} }
return updateType; return updateType;

View file

@ -13,26 +13,35 @@ namespace MediaBrowser.Providers.Music
{ {
public class ArtistMetadataService : MetadataService<MusicArtist, ArtistInfo> public class ArtistMetadataService : MetadataService<MusicArtist, ArtistInfo>
{ {
protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicArtist item) public ArtistMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{ {
return item.IsAccessedByName ?
item.GetTaggedItems(new InternalItemsQuery
{
Recursive = true,
IsFolder = false
}) :
item.GetRecursiveChildren(i => i is IHasArtist && !i.IsFolder);
} }
/// <inheritdoc />
protected override bool EnableUpdatingGenresFromChildren => true; protected override bool EnableUpdatingGenresFromChildren => true;
/// <inheritdoc />
protected override IList<BaseItem> GetChildrenForMetadataUpdates(MusicArtist item)
{
return item.IsAccessedByName
? item.GetTaggedItems(new InternalItemsQuery
{
Recursive = true,
IsFolder = false
})
: item.GetRecursiveChildren(i => i is IHasArtist && !i.IsFolder);
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<MusicArtist> source, MetadataResult<MusicArtist> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<MusicArtist> source, MetadataResult<MusicArtist> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public ArtistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -25,6 +25,14 @@ namespace MediaBrowser.Providers.Music
_json = json; _json = json;
} }
/// <inheritdoc />
public string Name => "TheAudioDB";
/// <inheritdoc />
// After embedded and fanart
public int Order => 2;
/// <inheritdoc />
public IEnumerable<ImageType> GetSupportedImages(BaseItem item) public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
{ {
return new List<ImageType> return new List<ImageType>
@ -34,6 +42,7 @@ namespace MediaBrowser.Providers.Music
}; };
} }
/// <inheritdoc />
public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken) public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
{ {
var id = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup); var id = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
@ -82,6 +91,7 @@ namespace MediaBrowser.Providers.Music
return list; return list;
} }
/// <inheritdoc />
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken) public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
{ {
return _httpClient.GetResponse(new HttpRequestOptions return _httpClient.GetResponse(new HttpRequestOptions
@ -91,13 +101,7 @@ namespace MediaBrowser.Providers.Music
}); });
} }
public string Name => "TheAudioDB"; /// <inheritdoc />
// After embedded and fanart public bool Supports(BaseItem item) => item is MusicAlbum;
public int Order => 2;
public bool Supports(BaseItem item)
{
return item is MusicAlbum;
}
} }
} }

View file

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
@ -26,8 +27,6 @@ namespace MediaBrowser.Providers.Music
public static AudioDbAlbumProvider Current; public static AudioDbAlbumProvider Current;
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
public AudioDbAlbumProvider(IServerConfigurationManager config, IFileSystem fileSystem, IHttpClient httpClient, IJsonSerializer json) public AudioDbAlbumProvider(IServerConfigurationManager config, IFileSystem fileSystem, IHttpClient httpClient, IJsonSerializer json)
{ {
_config = config; _config = config;
@ -38,11 +37,18 @@ namespace MediaBrowser.Providers.Music
Current = this; Current = this;
} }
public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken) /// <inheritdoc />
{ public string Name => "TheAudioDB";
return Task.FromResult((IEnumerable<RemoteSearchResult>)new List<RemoteSearchResult>());
}
/// <inheritdoc />
// After music brainz
public int Order => 1;
/// <inheritdoc />
public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken)
=> Task.FromResult(Enumerable.Empty<RemoteSearchResult>());
/// <inheritdoc />
public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo info, CancellationToken cancellationToken) public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo info, CancellationToken cancellationToken)
{ {
var result = new MetadataResult<MusicAlbum>(); var result = new MetadataResult<MusicAlbum>();
@ -77,7 +83,7 @@ namespace MediaBrowser.Providers.Music
if (!string.IsNullOrEmpty(result.intYearReleased)) if (!string.IsNullOrEmpty(result.intYearReleased))
{ {
item.ProductionYear = int.Parse(result.intYearReleased, _usCulture); item.ProductionYear = int.Parse(result.intYearReleased, CultureInfo.InvariantCulture);
} }
if (!string.IsNullOrEmpty(result.strGenre)) if (!string.IsNullOrEmpty(result.strGenre))
@ -126,8 +132,6 @@ namespace MediaBrowser.Providers.Music
item.Overview = (overview ?? string.Empty).StripHtml(); item.Overview = (overview ?? string.Empty).StripHtml();
} }
public string Name => "TheAudioDB";
internal Task EnsureInfo(string musicBrainzReleaseGroupId, CancellationToken cancellationToken) internal Task EnsureInfo(string musicBrainzReleaseGroupId, CancellationToken cancellationToken)
{ {
var xmlPath = GetAlbumInfoPath(_config.ApplicationPaths, musicBrainzReleaseGroupId); var xmlPath = GetAlbumInfoPath(_config.ApplicationPaths, musicBrainzReleaseGroupId);
@ -155,20 +159,18 @@ namespace MediaBrowser.Providers.Music
Directory.CreateDirectory(Path.GetDirectoryName(path)); Directory.CreateDirectory(Path.GetDirectoryName(path));
using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions using (var httpResponse = await _httpClient.SendAsync(
{ new HttpRequestOptions
Url = url,
CancellationToken = cancellationToken
}, "GET").ConfigureAwait(false))
{
using (var response = httpResponse.Content)
{ {
using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) Url = url,
{ CancellationToken = cancellationToken
await response.CopyToAsync(xmlFileStream).ConfigureAwait(false);
} },
} "GET").ConfigureAwait(false))
using (var response = httpResponse.Content)
using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
{
await response.CopyToAsync(xmlFileStream).ConfigureAwait(false);
} }
} }
@ -192,8 +194,6 @@ namespace MediaBrowser.Providers.Music
return Path.Combine(dataPath, "album.json"); return Path.Combine(dataPath, "album.json");
} }
// After music brainz
public int Order => 1;
public class Album public class Album
{ {
@ -242,6 +242,7 @@ namespace MediaBrowser.Providers.Music
public List<Album> album { get; set; } public List<Album> album { get; set; }
} }
/// <inheritdoc />
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken) public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View file

@ -25,6 +25,14 @@ namespace MediaBrowser.Providers.Music
_httpClient = httpClient; _httpClient = httpClient;
} }
/// <inheritdoc />
public string Name => "TheAudioDB";
/// <inheritdoc />
// After fanart
public int Order => 1;
/// <inheritdoc />
public IEnumerable<ImageType> GetSupportedImages(BaseItem item) public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
{ {
return new List<ImageType> return new List<ImageType>
@ -36,6 +44,7 @@ namespace MediaBrowser.Providers.Music
}; };
} }
/// <inheritdoc />
public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken) public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
{ {
var id = item.GetProviderId(MetadataProviders.MusicBrainzArtist); var id = item.GetProviderId(MetadataProviders.MusicBrainzArtist);
@ -133,13 +142,7 @@ namespace MediaBrowser.Providers.Music
}); });
} }
public string Name => "TheAudioDB"; /// <inheritdoc />
public bool Supports(BaseItem item) => item is MusicArtist;
public bool Supports(BaseItem item)
{
return item is MusicArtist;
}
// After fanart
public int Order => 1;
} }
} }

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
@ -37,11 +38,18 @@ namespace MediaBrowser.Providers.Music
Current = this; Current = this;
} }
public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken) /// <inheritdoc />
{ public string Name => "TheAudioDB";
return Task.FromResult((IEnumerable<RemoteSearchResult>)new List<RemoteSearchResult>());
}
/// <inheritdoc />
// After musicbrainz
public int Order => 1;
/// <inheritdoc />
public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken)
=> Task.FromResult(Enumerable.Empty<RemoteSearchResult>());
/// <inheritdoc />
public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo info, CancellationToken cancellationToken) public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo info, CancellationToken cancellationToken)
{ {
var result = new MetadataResult<MusicArtist>(); var result = new MetadataResult<MusicArtist>();
@ -114,20 +122,16 @@ namespace MediaBrowser.Providers.Music
item.Overview = (overview ?? string.Empty).StripHtml(); item.Overview = (overview ?? string.Empty).StripHtml();
} }
public string Name => "TheAudioDB";
internal Task EnsureArtistInfo(string musicBrainzId, CancellationToken cancellationToken) internal Task EnsureArtistInfo(string musicBrainzId, CancellationToken cancellationToken)
{ {
var xmlPath = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId); var xmlPath = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId);
var fileInfo = _fileSystem.GetFileSystemInfo(xmlPath); var fileInfo = _fileSystem.GetFileSystemInfo(xmlPath);
if (fileInfo.Exists) if (fileInfo.Exists
&& (DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 2)
{ {
if ((DateTime.UtcNow - _fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays <= 2) return Task.CompletedTask;
{
return Task.CompletedTask;
}
} }
return DownloadArtistInfo(musicBrainzId, cancellationToken); return DownloadArtistInfo(musicBrainzId, cancellationToken);
@ -141,22 +145,21 @@ namespace MediaBrowser.Providers.Music
var path = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId); var path = GetArtistInfoPath(_config.ApplicationPaths, musicBrainzId);
using (var httpResponse = await _httpClient.SendAsync(new HttpRequestOptions using (var httpResponse = await _httpClient.SendAsync(
{ new HttpRequestOptions
Url = url,
CancellationToken = cancellationToken,
BufferContent = true
}, "GET").ConfigureAwait(false))
{
using (var response = httpResponse.Content)
{ {
Directory.CreateDirectory(Path.GetDirectoryName(path)); Url = url,
CancellationToken = cancellationToken,
BufferContent = true
},
"GET").ConfigureAwait(false))
using (var response = httpResponse.Content)
{
Directory.CreateDirectory(Path.GetDirectoryName(path));
using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) using (var xmlFileStream = _fileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
{ {
await response.CopyToAsync(xmlFileStream).ConfigureAwait(false); await response.CopyToAsync(xmlFileStream).ConfigureAwait(false);
}
} }
} }
} }
@ -168,11 +171,7 @@ namespace MediaBrowser.Providers.Music
/// <param name="musicBrainzArtistId">The music brainz artist identifier.</param> /// <param name="musicBrainzArtistId">The music brainz artist identifier.</param>
/// <returns>System.String.</returns> /// <returns>System.String.</returns>
private static string GetArtistDataPath(IApplicationPaths appPaths, string musicBrainzArtistId) private static string GetArtistDataPath(IApplicationPaths appPaths, string musicBrainzArtistId)
{ => Path.Combine(GetArtistDataPath(appPaths), musicBrainzArtistId);
var dataPath = Path.Combine(GetArtistDataPath(appPaths), musicBrainzArtistId);
return dataPath;
}
/// <summary> /// <summary>
/// Gets the artist data path. /// Gets the artist data path.
@ -180,11 +179,7 @@ namespace MediaBrowser.Providers.Music
/// <param name="appPaths">The application paths.</param> /// <param name="appPaths">The application paths.</param>
/// <returns>System.String.</returns> /// <returns>System.String.</returns>
private static string GetArtistDataPath(IApplicationPaths appPaths) private static string GetArtistDataPath(IApplicationPaths appPaths)
{ => Path.Combine(appPaths.CachePath, "audiodb-artist");
var dataPath = Path.Combine(appPaths.CachePath, "audiodb-artist");
return dataPath;
}
internal static string GetArtistInfoPath(IApplicationPaths appPaths, string musicBrainzArtistId) internal static string GetArtistInfoPath(IApplicationPaths appPaths, string musicBrainzArtistId)
{ {
@ -242,9 +237,8 @@ namespace MediaBrowser.Providers.Music
{ {
public List<Artist> artists { get; set; } public List<Artist> artists { get; set; }
} }
// After musicbrainz
public int Order => 1;
/// <inheritdoc />
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken) public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View file

@ -6,58 +6,63 @@ namespace MediaBrowser.Providers.Music
{ {
public class AudioDbAlbumExternalId : IExternalId public class AudioDbAlbumExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "TheAudioDb"; public string Name => "TheAudioDb";
/// <inheritdoc />
public string Key => MetadataProviders.AudioDbAlbum.ToString(); public string Key => MetadataProviders.AudioDbAlbum.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://www.theaudiodb.com/album/{0}"; public string UrlFormatString => "https://www.theaudiodb.com/album/{0}";
/// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ => item is MusicAlbum;
return item is MusicAlbum;
}
} }
public class AudioDbOtherAlbumExternalId : IExternalId public class AudioDbOtherAlbumExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "TheAudioDb Album"; public string Name => "TheAudioDb Album";
/// <inheritdoc />
public string Key => MetadataProviders.AudioDbAlbum.ToString(); public string Key => MetadataProviders.AudioDbAlbum.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://www.theaudiodb.com/album/{0}"; public string UrlFormatString => "https://www.theaudiodb.com/album/{0}";
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is Audio;
return item is Audio;
}
} }
public class AudioDbArtistExternalId : IExternalId public class AudioDbArtistExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "TheAudioDb"; public string Name => "TheAudioDb";
/// <inheritdoc />
public string Key => MetadataProviders.AudioDbArtist.ToString(); public string Key => MetadataProviders.AudioDbArtist.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}"; public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}";
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is MusicArtist;
return item is MusicArtist;
}
} }
public class AudioDbOtherArtistExternalId : IExternalId public class AudioDbOtherArtistExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "TheAudioDb Artist"; public string Name => "TheAudioDb Artist";
/// <inheritdoc />
public string Key => MetadataProviders.AudioDbArtist.ToString(); public string Key => MetadataProviders.AudioDbArtist.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}"; public string UrlFormatString => "https://www.theaudiodb.com/artist/{0}";
/// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ => item is Audio || item is MusicAlbum;
return item is Audio || item is MusicAlbum;
}
} }
} }

View file

@ -16,9 +16,8 @@ namespace MediaBrowser.Providers.Music
ILogger logger, ILogger logger,
IProviderManager providerManager, IProviderManager providerManager,
IFileSystem fileSystem, IFileSystem fileSystem,
IUserDataManager userDataManager,
ILibraryManager libraryManager) ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{ {
} }

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
@ -14,7 +15,6 @@ using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers; using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Serialization;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -22,16 +22,6 @@ namespace MediaBrowser.Providers.Music
{ {
public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
{ {
internal static MusicBrainzAlbumProvider Current;
private readonly IHttpClient _httpClient;
private readonly IApplicationHost _appHost;
private readonly ILogger _logger;
private readonly IJsonSerializer _json;
private Stopwatch _stopWatchMusicBrainz = new Stopwatch();
public readonly string MusicBrainzBaseUrl;
/// <summary> /// <summary>
/// The Jellyfin user-agent is unrestricted but source IP must not exceed /// The Jellyfin user-agent is unrestricted but source IP must not exceed
/// one request per second, therefore we rate limit to avoid throttling. /// one request per second, therefore we rate limit to avoid throttling.
@ -47,19 +37,27 @@ namespace MediaBrowser.Providers.Music
/// </summary> /// </summary>
private const uint MusicBrainzQueryAttempts = 5u; private const uint MusicBrainzQueryAttempts = 5u;
internal static MusicBrainzAlbumProvider Current;
private readonly IHttpClient _httpClient;
private readonly IApplicationHost _appHost;
private readonly ILogger _logger;
private readonly string _musicBrainzBaseUrl;
private Stopwatch _stopWatchMusicBrainz = new Stopwatch();
public MusicBrainzAlbumProvider( public MusicBrainzAlbumProvider(
IHttpClient httpClient, IHttpClient httpClient,
IApplicationHost appHost, IApplicationHost appHost,
ILogger logger, ILogger logger,
IJsonSerializer json,
IConfiguration configuration) IConfiguration configuration)
{ {
_httpClient = httpClient; _httpClient = httpClient;
_appHost = appHost; _appHost = appHost;
_logger = logger; _logger = logger;
_json = json;
MusicBrainzBaseUrl = configuration["MusicBrainz:BaseUrl"]; _musicBrainzBaseUrl = configuration["MusicBrainz:BaseUrl"];
// Use a stopwatch to ensure we don't exceed the MusicBrainz rate limit // Use a stopwatch to ensure we don't exceed the MusicBrainz rate limit
_stopWatchMusicBrainz.Start(); _stopWatchMusicBrainz.Start();
@ -67,6 +65,13 @@ namespace MediaBrowser.Providers.Music
Current = this; Current = this;
} }
/// <inheritdoc />
public string Name => "MusicBrainz";
/// <inheritdoc />
public int Order => 0;
/// <inheritdoc />
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken) public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken)
{ {
var releaseId = searchInfo.GetReleaseId(); var releaseId = searchInfo.GetReleaseId();
@ -76,11 +81,11 @@ namespace MediaBrowser.Providers.Music
if (!string.IsNullOrEmpty(releaseId)) if (!string.IsNullOrEmpty(releaseId))
{ {
url = string.Format("/ws/2/release/?query=reid:{0}", releaseId); url = "/ws/2/release/?query=reid:" + releaseId.ToString(CultureInfo.InvariantCulture);
} }
else if (!string.IsNullOrEmpty(releaseGroupId)) else if (!string.IsNullOrEmpty(releaseGroupId))
{ {
url = string.Format("/ws/2/release?release-group={0}", releaseGroupId); url = "/ws/2/release?release-group=" + releaseGroupId.ToString(CultureInfo.InvariantCulture);
} }
else else
{ {
@ -88,7 +93,9 @@ namespace MediaBrowser.Providers.Music
if (!string.IsNullOrWhiteSpace(artistMusicBrainzId)) if (!string.IsNullOrWhiteSpace(artistMusicBrainzId))
{ {
url = string.Format("/ws/2/release/?query=\"{0}\" AND arid:{1}", url = string.Format(
CultureInfo.InvariantCulture,
"/ws/2/release/?query=\"{0}\" AND arid:{1}",
WebUtility.UrlEncode(searchInfo.Name), WebUtility.UrlEncode(searchInfo.Name),
artistMusicBrainzId); artistMusicBrainzId);
} }
@ -97,7 +104,9 @@ namespace MediaBrowser.Providers.Music
// I'm sure there is a better way but for now it resolves search for 12" Mixes // I'm sure there is a better way but for now it resolves search for 12" Mixes
var queryName = searchInfo.Name.Replace("\"", string.Empty); var queryName = searchInfo.Name.Replace("\"", string.Empty);
url = string.Format("/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"", url = string.Format(
CultureInfo.InvariantCulture,
"/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
WebUtility.UrlEncode(queryName), WebUtility.UrlEncode(queryName),
WebUtility.UrlEncode(searchInfo.GetAlbumArtist())); WebUtility.UrlEncode(searchInfo.GetAlbumArtist()));
} }
@ -106,11 +115,9 @@ namespace MediaBrowser.Providers.Music
if (!string.IsNullOrWhiteSpace(url)) if (!string.IsNullOrWhiteSpace(url))
{ {
using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false)) using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
using (var stream = response.Content)
{ {
using (var stream = response.Content) return GetResultsFromResponse(stream);
{
return GetResultsFromResponse(stream);
}
} }
} }
@ -156,6 +163,7 @@ namespace MediaBrowser.Providers.Music
{ {
result.SetProviderId(MetadataProviders.MusicBrainzAlbum, i.ReleaseId); result.SetProviderId(MetadataProviders.MusicBrainzAlbum, i.ReleaseId);
} }
if (!string.IsNullOrWhiteSpace(i.ReleaseGroupId)) if (!string.IsNullOrWhiteSpace(i.ReleaseGroupId))
{ {
result.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, i.ReleaseGroupId); result.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, i.ReleaseGroupId);
@ -168,6 +176,7 @@ namespace MediaBrowser.Providers.Music
} }
} }
/// <inheritdoc />
public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken) public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken)
{ {
var releaseId = id.GetReleaseId(); var releaseId = id.GetReleaseId();
@ -238,8 +247,6 @@ namespace MediaBrowser.Providers.Music
return result; return result;
} }
public string Name => "MusicBrainz";
private Task<ReleaseResult> GetReleaseResult(string artistMusicBrainId, string artistName, string albumName, CancellationToken cancellationToken) private Task<ReleaseResult> GetReleaseResult(string artistMusicBrainId, string artistName, string albumName, CancellationToken cancellationToken)
{ {
if (!string.IsNullOrEmpty(artistMusicBrainId)) if (!string.IsNullOrEmpty(artistMusicBrainId))
@ -282,7 +289,9 @@ namespace MediaBrowser.Providers.Music
private async Task<ReleaseResult> GetReleaseResultByArtistName(string albumName, string artistName, CancellationToken cancellationToken) private async Task<ReleaseResult> GetReleaseResultByArtistName(string albumName, string artistName, CancellationToken cancellationToken)
{ {
var url = string.Format("/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"", var url = string.Format(
CultureInfo.InvariantCulture,
"/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
WebUtility.UrlEncode(albumName), WebUtility.UrlEncode(albumName),
WebUtility.UrlEncode(artistName)); WebUtility.UrlEncode(artistName));
@ -334,6 +343,7 @@ namespace MediaBrowser.Providers.Music
reader.Read(); reader.Read();
continue; continue;
} }
using (var subReader = reader.ReadSubtree()) using (var subReader = reader.ReadSubtree())
{ {
return ParseReleaseList(subReader).ToList(); return ParseReleaseList(subReader).ToList();
@ -601,7 +611,7 @@ namespace MediaBrowser.Providers.Music
private async Task<string> GetReleaseIdFromReleaseGroupId(string releaseGroupId, CancellationToken cancellationToken) private async Task<string> GetReleaseIdFromReleaseGroupId(string releaseGroupId, CancellationToken cancellationToken)
{ {
var url = string.Format("/ws/2/release?release-group={0}", releaseGroupId); var url = "/ws/2/release?release-group=" + releaseGroupId.ToString(CultureInfo.InvariantCulture);
using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false)) using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
using (var stream = response.Content) using (var stream = response.Content)
@ -637,7 +647,7 @@ namespace MediaBrowser.Providers.Music
/// <returns>Task{System.String}.</returns> /// <returns>Task{System.String}.</returns>
private async Task<string> GetReleaseGroupFromReleaseId(string releaseEntryId, CancellationToken cancellationToken) private async Task<string> GetReleaseGroupFromReleaseId(string releaseEntryId, CancellationToken cancellationToken)
{ {
var url = string.Format("/ws/2/release-group/?query=reid:{0}", releaseEntryId); var url = "/ws/2/release-group/?query=reid:" + releaseEntryId.ToString(CultureInfo.InvariantCulture);
using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false)) using (var response = await GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
using (var stream = response.Content) using (var stream = response.Content)
@ -687,6 +697,7 @@ namespace MediaBrowser.Providers.Music
reader.Read(); reader.Read();
} }
} }
return null; return null;
} }
} }
@ -734,11 +745,15 @@ namespace MediaBrowser.Providers.Music
{ {
var options = new HttpRequestOptions var options = new HttpRequestOptions
{ {
Url = MusicBrainzBaseUrl.TrimEnd('/') + url, Url = _musicBrainzBaseUrl.TrimEnd('/') + url,
CancellationToken = cancellationToken, CancellationToken = cancellationToken,
// MusicBrainz request a contact email address is supplied, as comment, in user agent field: // MusicBrainz request a contact email address is supplied, as comment, in user agent field:
// https://musicbrainz.org/doc/XML_Web_Service/Rate_Limiting#User-Agent // https://musicbrainz.org/doc/XML_Web_Service/Rate_Limiting#User-Agent
UserAgent = string.Format("{0} ( {1} )", _appHost.ApplicationUserAgent, _appHost.ApplicationUserAgentAddress), UserAgent = string.Format(
CultureInfo.InvariantCulture,
"{0} ( {1} )",
_appHost.ApplicationUserAgent,
_appHost.ApplicationUserAgentAddress),
BufferContent = false BufferContent = false
}; };
@ -768,7 +783,7 @@ namespace MediaBrowser.Providers.Music
while (attempts < MusicBrainzQueryAttempts && response.StatusCode == HttpStatusCode.ServiceUnavailable); while (attempts < MusicBrainzQueryAttempts && response.StatusCode == HttpStatusCode.ServiceUnavailable);
// Log error if unable to query MB database due to throttling // Log error if unable to query MB database due to throttling
if (attempts == MusicBrainzQueryAttempts && response.StatusCode == HttpStatusCode.ServiceUnavailable ) if (attempts == MusicBrainzQueryAttempts && response.StatusCode == HttpStatusCode.ServiceUnavailable)
{ {
_logger.LogError("GetMusicBrainzResponse: 503 Service Unavailable (throttled) response received {0} times whilst requesting {1}", attempts, options.Url); _logger.LogError("GetMusicBrainzResponse: 503 Service Unavailable (throttled) response received {0} times whilst requesting {1}", attempts, options.Url);
} }
@ -776,8 +791,7 @@ namespace MediaBrowser.Providers.Music
return response; return response;
} }
public int Order => 0; /// <inheritdoc />
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken) public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
@ -18,25 +19,19 @@ namespace MediaBrowser.Providers.Music
{ {
public class MusicBrainzArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo> public class MusicBrainzArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>
{ {
public MusicBrainzArtistProvider() /// <inheritdoc />
{
}
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken) public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken)
{ {
var musicBrainzId = searchInfo.GetMusicBrainzArtistId(); var musicBrainzId = searchInfo.GetMusicBrainzArtistId();
if (!string.IsNullOrWhiteSpace(musicBrainzId)) if (!string.IsNullOrWhiteSpace(musicBrainzId))
{ {
var url = string.Format("/ws/2/artist/?query=arid:{0}", musicBrainzId); var url = "/ws/2/artist/?query=arid:{0}" + musicBrainzId.ToString(CultureInfo.InvariantCulture);
using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false)) using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
using (var stream = response.Content)
{ {
using (var stream = response.Content) return GetResultsFromResponse(stream);
{
return GetResultsFromResponse(stream);
}
} }
} }
else else
@ -47,15 +42,13 @@ namespace MediaBrowser.Providers.Music
var url = string.Format("/ws/2/artist/?query=\"{0}\"&dismax=true", UrlEncode(nameToSearch)); var url = string.Format("/ws/2/artist/?query=\"{0}\"&dismax=true", UrlEncode(nameToSearch));
using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false)) using (var response = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, cancellationToken).ConfigureAwait(false))
using (var stream = response.Content)
{ {
using (var stream = response.Content) var results = GetResultsFromResponse(stream).ToList();
{
var results = GetResultsFromResponse(stream).ToList();
if (results.Count > 0) if (results.Count > 0)
{ {
return results; return results;
}
} }
} }

View file

@ -7,99 +7,112 @@ namespace MediaBrowser.Providers.Music
{ {
public class MusicBrainzReleaseGroupExternalId : IExternalId public class MusicBrainzReleaseGroupExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "MusicBrainz Release Group"; public string Name => "MusicBrainz Release Group";
/// <inheritdoc />
public string Key => MetadataProviders.MusicBrainzReleaseGroup.ToString(); public string Key => MetadataProviders.MusicBrainzReleaseGroup.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://musicbrainz.org/release-group/{0}"; public string UrlFormatString => "https://musicbrainz.org/release-group/{0}";
/// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ => item is Audio || item is MusicAlbum;
return item is Audio || item is MusicAlbum;
}
} }
public class MusicBrainzAlbumArtistExternalId : IExternalId public class MusicBrainzAlbumArtistExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "MusicBrainz Album Artist"; public string Name => "MusicBrainz Album Artist";
/// <inheritdoc />
public string Key => MetadataProviders.MusicBrainzAlbumArtist.ToString(); public string Key => MetadataProviders.MusicBrainzAlbumArtist.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://musicbrainz.org/artist/{0}"; public string UrlFormatString => "https://musicbrainz.org/artist/{0}";
/// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ => item is Audio;
return item is Audio;
}
} }
public class MusicBrainzAlbumExternalId : IExternalId public class MusicBrainzAlbumExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "MusicBrainz Album"; public string Name => "MusicBrainz Album";
/// <inheritdoc />
public string Key => MetadataProviders.MusicBrainzAlbum.ToString(); public string Key => MetadataProviders.MusicBrainzAlbum.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://musicbrainz.org/release/{0}"; public string UrlFormatString => "https://musicbrainz.org/release/{0}";
/// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ => item is Audio || item is MusicAlbum;
return item is Audio || item is MusicAlbum;
}
} }
public class MusicBrainzArtistExternalId : IExternalId public class MusicBrainzArtistExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "MusicBrainz"; public string Name => "MusicBrainz";
/// <inheritdoc />
public string Key => MetadataProviders.MusicBrainzArtist.ToString(); public string Key => MetadataProviders.MusicBrainzArtist.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://musicbrainz.org/artist/{0}"; public string UrlFormatString => "https://musicbrainz.org/artist/{0}";
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is MusicArtist;
return item is MusicArtist;
}
} }
public class MusicBrainzOtherArtistExternalId : IExternalId public class MusicBrainzOtherArtistExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "MusicBrainz Artist"; public string Name => "MusicBrainz Artist";
/// <inheritdoc />
public string Key => MetadataProviders.MusicBrainzArtist.ToString(); public string Key => MetadataProviders.MusicBrainzArtist.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://musicbrainz.org/artist/{0}"; public string UrlFormatString => "https://musicbrainz.org/artist/{0}";
/// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ => item is Audio || item is MusicAlbum;
return item is Audio || item is MusicAlbum;
}
} }
public class MusicBrainzTrackId : IExternalId public class MusicBrainzTrackId : IExternalId
{ {
/// <inheritdoc />
public string Name => "MusicBrainz Track"; public string Name => "MusicBrainz Track";
/// <inheritdoc />
public string Key => MetadataProviders.MusicBrainzTrack.ToString(); public string Key => MetadataProviders.MusicBrainzTrack.ToString();
/// <inheritdoc />
public string UrlFormatString => "https://musicbrainz.org/track/{0}"; public string UrlFormatString => "https://musicbrainz.org/track/{0}";
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is Audio;
return item is Audio;
}
} }
public class ImvdbId : IExternalId public class ImvdbId : IExternalId
{ {
/// <inheritdoc />
public string Name => "IMVDb"; public string Name => "IMVDb";
/// <inheritdoc />
public string Key => "IMVDb"; public string Key => "IMVDb";
/// <inheritdoc />
public string UrlFormatString => null; public string UrlFormatString => null;
/// <inheritdoc />
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
{ => item is MusicVideo;
return item is MusicVideo;
}
} }
} }

View file

@ -16,9 +16,8 @@ namespace MediaBrowser.Providers.Music
ILogger logger, ILogger logger,
IProviderManager providerManager, IProviderManager providerManager,
IFileSystem fileSystem, IFileSystem fileSystem,
IUserDataManager userDataManager,
ILibraryManager libraryManager) ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{ {
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.MusicGenres
{ {
public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemLookupInfo> public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemLookupInfo>
{ {
public MusicGenreMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<MusicGenre> source, MetadataResult<MusicGenre> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<MusicGenre> source, MetadataResult<MusicGenre> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public MusicGenreMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.People
{ {
public class PersonMetadataService : MetadataService<Person, PersonLookupInfo> public class PersonMetadataService : MetadataService<Person, PersonLookupInfo>
{ {
public PersonMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<Person> source, MetadataResult<Person> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Person> source, MetadataResult<Person> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public PersonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -32,23 +32,22 @@ namespace MediaBrowser.Providers.People
_tvDbClientManager = tvDbClientManager; _tvDbClientManager = tvDbClientManager;
} }
public string Name => ProviderName; /// <inheritdoc />
public string Name => "TheTVDB";
public static string ProviderName => "TheTVDB"; /// <inheritdoc />
public int Order => 1;
public bool Supports(BaseItem item) /// <inheritdoc />
{ public bool Supports(BaseItem item) => item is Person;
return item is Person;
}
/// <inheritdoc />
public IEnumerable<ImageType> GetSupportedImages(BaseItem item) public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
{ {
return new List<ImageType> yield return ImageType.Primary;
{
ImageType.Primary
};
} }
/// <inheritdoc />
public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken) public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
{ {
var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery
@ -104,8 +103,7 @@ namespace MediaBrowser.Providers.People
} }
} }
public int Order => 1; /// <inheritdoc />
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken) public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
{ {
return _httpClient.GetResponse(new HttpRequestOptions return _httpClient.GetResponse(new HttpRequestOptions

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Photos
{ {
public class PhotoAlbumMetadataService : MetadataService<PhotoAlbum, ItemLookupInfo> public class PhotoAlbumMetadataService : MetadataService<PhotoAlbum, ItemLookupInfo>
{ {
public PhotoAlbumMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<PhotoAlbum> source, MetadataResult<PhotoAlbum> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<PhotoAlbum> source, MetadataResult<PhotoAlbum> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public PhotoAlbumMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Photos
{ {
public class PhotoMetadataService : MetadataService<Photo, ItemLookupInfo> public class PhotoMetadataService : MetadataService<Photo, ItemLookupInfo>
{ {
public PhotoMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<Photo> source, MetadataResult<Photo> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Photo> source, MetadataResult<Photo> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public PhotoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -13,11 +13,30 @@ namespace MediaBrowser.Providers.Playlists
{ {
public class PlaylistMetadataService : MetadataService<Playlist, ItemLookupInfo> public class PlaylistMetadataService : MetadataService<Playlist, ItemLookupInfo>
{ {
protected override IList<BaseItem> GetChildrenForMetadataUpdates(Playlist item) public PlaylistMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{ {
return item.GetLinkedChildren();
} }
/// <inheritdoc />
protected override bool EnableUpdatingGenresFromChildren => true;
/// <inheritdoc />
protected override bool EnableUpdatingOfficialRatingFromChildren => true;
/// <inheritdoc />
protected override bool EnableUpdatingStudiosFromChildren => true;
/// <inheritdoc />
protected override IList<BaseItem> GetChildrenForMetadataUpdates(Playlist item)
=> item.GetLinkedChildren();
/// <inheritdoc />
protected override void MergeData(MetadataResult<Playlist> source, MetadataResult<Playlist> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Playlist> source, MetadataResult<Playlist> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@ -32,15 +51,5 @@ namespace MediaBrowser.Providers.Playlists
targetItem.Shares = sourceItem.Shares; targetItem.Shares = sourceItem.Shares;
} }
} }
public PlaylistMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
protected override bool EnableUpdatingGenresFromChildren => true;
protected override bool EnableUpdatingOfficialRatingFromChildren => true;
protected override bool EnableUpdatingStudiosFromChildren => true;
} }
} }

View file

@ -11,13 +11,19 @@ namespace MediaBrowser.Providers.Studios
{ {
public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo> public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo>
{ {
public StudioMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem, ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<Studio> source, MetadataResult<Studio> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Studio> source, MetadataResult<Studio> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public StudioMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -19,6 +19,7 @@ using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Providers; using MediaBrowser.Model.Providers;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using static MediaBrowser.Model.IO.StreamDefaults;
namespace MediaBrowser.Providers.Subtitles namespace MediaBrowser.Providers.Subtitles
{ {
@ -30,8 +31,6 @@ namespace MediaBrowser.Providers.Subtitles
private readonly ILibraryMonitor _monitor; private readonly ILibraryMonitor _monitor;
private readonly IMediaSourceManager _mediaSourceManager; private readonly IMediaSourceManager _mediaSourceManager;
public event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure;
private ILocalizationManager _localization; private ILocalizationManager _localization;
public SubtitleManager( public SubtitleManager(
@ -48,17 +47,18 @@ namespace MediaBrowser.Providers.Subtitles
_localization = localizationManager; _localization = localizationManager;
} }
/// <inheritdoc />
public event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure;
/// <inheritdoc />
public void AddParts(IEnumerable<ISubtitleProvider> subtitleProviders) public void AddParts(IEnumerable<ISubtitleProvider> subtitleProviders)
{ {
_subtitleProviders = subtitleProviders _subtitleProviders = subtitleProviders
.OrderBy(i => .OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0)
{
var hasOrder = i as IHasOrder;
return hasOrder == null ? 0 : hasOrder.Order;
})
.ToArray(); .ToArray();
} }
/// <inheritdoc />
public async Task<RemoteSubtitleInfo[]> SearchSubtitles(SubtitleSearchRequest request, CancellationToken cancellationToken) public async Task<RemoteSubtitleInfo[]> SearchSubtitles(SubtitleSearchRequest request, CancellationToken cancellationToken)
{ {
if (request.Language != null) if (request.Language != null)
@ -104,7 +104,7 @@ namespace MediaBrowser.Providers.Subtitles
_logger.LogError(ex, "Error downloading subtitles from {Provider}", provider.Name); _logger.LogError(ex, "Error downloading subtitles from {Provider}", provider.Name);
} }
} }
return new RemoteSubtitleInfo[] { }; return Array.Empty<RemoteSubtitleInfo>();
} }
var tasks = providers.Select(async i => var tasks = providers.Select(async i =>
@ -120,7 +120,7 @@ namespace MediaBrowser.Providers.Subtitles
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error downloading subtitles from {0}", i.Name); _logger.LogError(ex, "Error downloading subtitles from {0}", i.Name);
return new RemoteSubtitleInfo[] { }; return Array.Empty<RemoteSubtitleInfo>();
} }
}); });
@ -129,6 +129,7 @@ namespace MediaBrowser.Providers.Subtitles
return results.SelectMany(i => i).ToArray(); return results.SelectMany(i => i).ToArray();
} }
/// <inheritdoc />
public Task DownloadSubtitles(Video video, string subtitleId, CancellationToken cancellationToken) public Task DownloadSubtitles(Video video, string subtitleId, CancellationToken cancellationToken)
{ {
var libraryOptions = BaseItem.LibraryManager.GetLibraryOptions(video); var libraryOptions = BaseItem.LibraryManager.GetLibraryOptions(video);
@ -136,7 +137,9 @@ namespace MediaBrowser.Providers.Subtitles
return DownloadSubtitles(video, libraryOptions, subtitleId, cancellationToken); return DownloadSubtitles(video, libraryOptions, subtitleId, cancellationToken);
} }
public async Task DownloadSubtitles(Video video, /// <inheritdoc />
public async Task DownloadSubtitles(
Video video,
LibraryOptions libraryOptions, LibraryOptions libraryOptions,
string subtitleId, string subtitleId,
CancellationToken cancellationToken) CancellationToken cancellationToken)
@ -151,31 +154,29 @@ namespace MediaBrowser.Providers.Subtitles
var response = await GetRemoteSubtitles(subtitleId, cancellationToken).ConfigureAwait(false); var response = await GetRemoteSubtitles(subtitleId, cancellationToken).ConfigureAwait(false);
using (var stream = response.Stream) using (var stream = response.Stream)
using (var memoryStream = new MemoryStream())
{ {
using (var memoryStream = new MemoryStream()) await stream.CopyToAsync(memoryStream).ConfigureAwait(false);
memoryStream.Position = 0;
var savePaths = new List<string>();
var saveFileName = Path.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLowerInvariant();
if (response.IsForced)
{ {
await stream.CopyToAsync(memoryStream).ConfigureAwait(false); saveFileName += ".forced";
memoryStream.Position = 0;
var savePaths = new List<string>();
var saveFileName = Path.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLowerInvariant();
if (response.IsForced)
{
saveFileName += ".forced";
}
saveFileName += "." + response.Format.ToLowerInvariant();
if (saveInMediaFolder)
{
savePaths.Add(Path.Combine(video.ContainingFolderPath, saveFileName));
}
savePaths.Add(Path.Combine(video.GetInternalMetadataPath(), saveFileName));
await TrySaveToFiles(memoryStream, savePaths).ConfigureAwait(false);
} }
saveFileName += "." + response.Format.ToLowerInvariant();
if (saveInMediaFolder)
{
savePaths.Add(Path.Combine(video.ContainingFolderPath, saveFileName));
}
savePaths.Add(Path.Combine(video.GetInternalMetadataPath(), saveFileName));
await TrySaveToFiles(memoryStream, savePaths).ConfigureAwait(false);
} }
} }
catch (RateLimitExceededException) catch (RateLimitExceededException)
@ -209,7 +210,7 @@ namespace MediaBrowser.Providers.Subtitles
{ {
Directory.CreateDirectory(Path.GetDirectoryName(savePath)); Directory.CreateDirectory(Path.GetDirectoryName(savePath));
using (var fs = _fileSystem.GetFileStream(savePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) using (var fs = new FileStream(savePath, FileMode.Create, FileAccess.Write, FileShare.Read, DefaultFileStreamBufferSize, true))
{ {
await stream.CopyToAsync(fs).ConfigureAwait(false); await stream.CopyToAsync(fs).ConfigureAwait(false);
} }
@ -237,11 +238,12 @@ namespace MediaBrowser.Providers.Subtitles
} }
} }
/// <inheritdoc />
public Task<RemoteSubtitleInfo[]> SearchSubtitles(Video video, string language, bool? isPerfectMatch, CancellationToken cancellationToken) public Task<RemoteSubtitleInfo[]> SearchSubtitles(Video video, string language, bool? isPerfectMatch, CancellationToken cancellationToken)
{ {
if (video.VideoType != VideoType.VideoFile) if (video.VideoType != VideoType.VideoFile)
{ {
return Task.FromResult(new RemoteSubtitleInfo[] { }); return Task.FromResult(Array.Empty<RemoteSubtitleInfo>());
} }
VideoContentType mediaType; VideoContentType mediaType;
@ -257,7 +259,7 @@ namespace MediaBrowser.Providers.Subtitles
else else
{ {
// These are the only supported types // These are the only supported types
return Task.FromResult(new RemoteSubtitleInfo[] { }); return Task.FromResult(Array.Empty<RemoteSubtitleInfo>());
} }
var request = new SubtitleSearchRequest var request = new SubtitleSearchRequest
@ -274,9 +276,7 @@ namespace MediaBrowser.Providers.Subtitles
IsPerfectMatch = isPerfectMatch ?? false IsPerfectMatch = isPerfectMatch ?? false
}; };
var episode = video as Episode; if (video is Episode episode)
if (episode != null)
{ {
request.IndexNumberEnd = episode.IndexNumberEnd; request.IndexNumberEnd = episode.IndexNumberEnd;
request.SeriesName = episode.SeriesName; request.SeriesName = episode.SeriesName;
@ -303,6 +303,7 @@ namespace MediaBrowser.Providers.Subtitles
return _subtitleProviders.First(i => string.Equals(id, GetProviderId(i.Name))); return _subtitleProviders.First(i => string.Equals(id, GetProviderId(i.Name)));
} }
/// <inheritdoc />
public Task DeleteSubtitles(BaseItem item, int index) public Task DeleteSubtitles(BaseItem item, int index)
{ {
var stream = _mediaSourceManager.GetMediaStreams(new MediaStreamQuery var stream = _mediaSourceManager.GetMediaStreams(new MediaStreamQuery
@ -328,16 +329,18 @@ namespace MediaBrowser.Providers.Subtitles
return item.RefreshMetadata(CancellationToken.None); return item.RefreshMetadata(CancellationToken.None);
} }
/// <inheritdoc />
public Task<SubtitleResponse> GetRemoteSubtitles(string id, CancellationToken cancellationToken) public Task<SubtitleResponse> GetRemoteSubtitles(string id, CancellationToken cancellationToken)
{ {
var parts = id.Split(new[] { '_' }, 2); var parts = id.Split(new[] { '_' }, 2);
var provider = GetProvider(parts.First()); var provider = GetProvider(parts[0]);
id = parts.Last(); id = parts.Last();
return provider.GetSubtitles(id, cancellationToken); return provider.GetSubtitles(id, cancellationToken);
} }
/// <inheritdoc />
public SubtitleProviderInfo[] GetSupportedProviders(BaseItem video) public SubtitleProviderInfo[] GetSupportedProviders(BaseItem video)
{ {
VideoContentType mediaType; VideoContentType mediaType;
@ -353,7 +356,7 @@ namespace MediaBrowser.Providers.Subtitles
else else
{ {
// These are the only supported types // These are the only supported types
return new SubtitleProviderInfo[] { }; return Array.Empty<SubtitleProviderInfo>();
} }
return _subtitleProviders return _subtitleProviders

View file

@ -16,17 +16,17 @@ namespace MediaBrowser.Providers.TV
{ {
public class DummySeasonProvider public class DummySeasonProvider
{ {
private readonly IServerConfigurationManager _config;
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly ILocalizationManager _localization; private readonly ILocalizationManager _localization;
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly CultureInfo _usCulture = new CultureInfo("en-US"); public DummySeasonProvider(
ILogger logger,
public DummySeasonProvider(IServerConfigurationManager config, ILogger logger, ILocalizationManager localization, ILibraryManager libraryManager, IFileSystem fileSystem) ILocalizationManager localization,
ILibraryManager libraryManager,
IFileSystem fileSystem)
{ {
_config = config;
_logger = logger; _logger = logger;
_localization = localization; _localization = localization;
_libraryManager = libraryManager; _libraryManager = libraryManager;
@ -127,9 +127,22 @@ namespace MediaBrowser.Providers.TV
bool isVirtualItem, bool isVirtualItem,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var seasonName = seasonNumber == 0 ? string seasonName;
_libraryManager.GetLibraryOptions(series).SeasonZeroDisplayName : if (seasonNumber == null)
(seasonNumber.HasValue ? string.Format(_localization.GetLocalizedString("NameSeasonNumber"), seasonNumber.Value.ToString(_usCulture)) : _localization.GetLocalizedString("NameSeasonUnknown")); {
seasonName = _localization.GetLocalizedString("NameSeasonUnknown");
}
else if (seasonNumber == 0)
{
seasonName = _libraryManager.GetLibraryOptions(series).SeasonZeroDisplayName;
}
else
{
seasonName = string.Format(
CultureInfo.InvariantCulture,
_localization.GetLocalizedString("NameSeasonNumber"),
seasonNumber.Value);
}
_logger.LogInformation("Creating Season {0} entry for {1}", seasonName, series.Name); _logger.LogInformation("Creating Season {0} entry for {1}", seasonName, series.Name);
@ -137,7 +150,9 @@ namespace MediaBrowser.Providers.TV
{ {
Name = seasonName, Name = seasonName,
IndexNumber = seasonNumber, IndexNumber = seasonNumber,
Id = _libraryManager.GetNewItemId((series.Id + (seasonNumber ?? -1).ToString(_usCulture) + seasonName), typeof(Season)), Id = _libraryManager.GetNewItemId(
series.Id + (seasonNumber ?? -1).ToString(CultureInfo.InvariantCulture) + seasonName,
typeof(Season)),
IsVirtualItem = isVirtualItem, IsVirtualItem = isVirtualItem,
SeriesId = series.Id, SeriesId = series.Id,
SeriesName = series.Name SeriesName = series.Name
@ -147,7 +162,7 @@ namespace MediaBrowser.Providers.TV
series.AddChild(season, cancellationToken); series.AddChild(season, cancellationToken);
await season.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), cancellationToken).ConfigureAwait(false); await season.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)), cancellationToken).ConfigureAwait(false);
return season; return season;
} }

View file

@ -12,6 +12,17 @@ namespace MediaBrowser.Providers.TV
{ {
public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo> public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo>
{ {
public EpisodeMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override ItemUpdateType BeforeSaveInternal(Episode item, bool isFullRefresh, ItemUpdateType currentUpdateType) protected override ItemUpdateType BeforeSaveInternal(Episode item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{ {
var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType); var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType);
@ -54,6 +65,7 @@ namespace MediaBrowser.Providers.TV
return updateType; return updateType;
} }
/// <inheritdoc />
protected override void MergeData(MetadataResult<Episode> source, MetadataResult<Episode> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Episode> source, MetadataResult<Episode> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@ -81,9 +93,5 @@ namespace MediaBrowser.Providers.TV
targetItem.IndexNumberEnd = sourceItem.IndexNumberEnd; targetItem.IndexNumberEnd = sourceItem.IndexNumberEnd;
} }
} }
public EpisodeMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -19,6 +19,8 @@ namespace MediaBrowser.Providers.TV
{ {
public class MissingEpisodeProvider public class MissingEpisodeProvider
{ {
private const double UnairedEpisodeThresholdDays = 2;
private readonly IServerConfigurationManager _config; private readonly IServerConfigurationManager _config;
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
@ -26,9 +28,6 @@ namespace MediaBrowser.Providers.TV
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly TvDbClientManager _tvDbClientManager; private readonly TvDbClientManager _tvDbClientManager;
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
private const double UnairedEpisodeThresholdDays = 2;
public MissingEpisodeProvider( public MissingEpisodeProvider(
ILogger logger, ILogger logger,
IServerConfigurationManager config, IServerConfigurationManager config,
@ -61,7 +60,7 @@ namespace MediaBrowser.Providers.TV
DateTime.TryParse(i.FirstAired, out var firstAired); DateTime.TryParse(i.FirstAired, out var firstAired);
var seasonNumber = i.AiredSeason.GetValueOrDefault(-1); var seasonNumber = i.AiredSeason.GetValueOrDefault(-1);
var episodeNumber = i.AiredEpisodeNumber.GetValueOrDefault(-1); var episodeNumber = i.AiredEpisodeNumber.GetValueOrDefault(-1);
return (seasonNumber: seasonNumber, episodeNumber: episodeNumber, firstAired: firstAired); return (seasonNumber, episodeNumber, firstAired);
}) })
.Where(i => i.seasonNumber != -1 && i.episodeNumber != -1) .Where(i => i.seasonNumber != -1 && i.episodeNumber != -1)
.OrderBy(i => i.seasonNumber) .OrderBy(i => i.seasonNumber)
@ -247,8 +246,9 @@ namespace MediaBrowser.Providers.TV
/// </summary> /// </summary>
/// <param name="allRecursiveChildren"></param> /// <param name="allRecursiveChildren"></param>
/// <param name="episodeLookup">The episode lookup.</param> /// <param name="episodeLookup">The episode lookup.</param>
/// <returns>Task{System.Boolean}.</returns> /// <returns><see cref="bool" />.</returns>
private bool RemoveObsoleteOrMissingSeasons(IList<BaseItem> allRecursiveChildren, private bool RemoveObsoleteOrMissingSeasons(
IList<BaseItem> allRecursiveChildren,
IEnumerable<(int seasonNumber, int episodeNumber, DateTime firstAired)> episodeLookup) IEnumerable<(int seasonNumber, int episodeNumber, DateTime firstAired)> episodeLookup)
{ {
var existingSeasons = allRecursiveChildren.OfType<Season>().ToList(); var existingSeasons = allRecursiveChildren.OfType<Season>().ToList();
@ -298,7 +298,6 @@ namespace MediaBrowser.Providers.TV
_libraryManager.DeleteItem(seasonToRemove, new DeleteOptions _libraryManager.DeleteItem(seasonToRemove, new DeleteOptions
{ {
DeleteFileLocation = true DeleteFileLocation = true
}, false); }, false);
hasChanges = true; hasChanges = true;
@ -322,18 +321,20 @@ namespace MediaBrowser.Providers.TV
if (season == null) if (season == null)
{ {
var provider = new DummySeasonProvider(_config, _logger, _localization, _libraryManager, _fileSystem); var provider = new DummySeasonProvider(_logger, _localization, _libraryManager, _fileSystem);
season = await provider.AddSeason(series, seasonNumber, true, cancellationToken).ConfigureAwait(false); season = await provider.AddSeason(series, seasonNumber, true, cancellationToken).ConfigureAwait(false);
} }
var name = $"Episode {episodeNumber.ToString(_usCulture)}"; var name = "Episode " + episodeNumber.ToString(CultureInfo.InvariantCulture);
var episode = new Episode var episode = new Episode
{ {
Name = name, Name = name,
IndexNumber = episodeNumber, IndexNumber = episodeNumber,
ParentIndexNumber = seasonNumber, ParentIndexNumber = seasonNumber,
Id = _libraryManager.GetNewItemId(series.Id + seasonNumber.ToString(_usCulture) + name, typeof(Episode)), Id = _libraryManager.GetNewItemId(
series.Id + seasonNumber.ToString(CultureInfo.InvariantCulture) + name,
typeof(Episode)),
IsVirtualItem = true, IsVirtualItem = true,
SeasonId = season?.Id ?? Guid.Empty, SeasonId = season?.Id ?? Guid.Empty,
SeriesId = series.Id SeriesId = series.Id
@ -341,7 +342,7 @@ namespace MediaBrowser.Providers.TV
season.AddChild(episode, cancellationToken); season.AddChild(episode, cancellationToken);
await episode.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_logger, _fileSystem)), cancellationToken).ConfigureAwait(false); await episode.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService(_fileSystem)), cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -351,7 +352,7 @@ namespace MediaBrowser.Providers.TV
/// <param name="seasonCounts"></param> /// <param name="seasonCounts"></param>
/// <param name="episodeTuple"></param> /// <param name="episodeTuple"></param>
/// <returns>Episode.</returns> /// <returns>Episode.</returns>
private Episode GetExistingEpisode(IList<Episode> existingEpisodes, IReadOnlyDictionary<int, int> seasonCounts, (int seasonNumber, int episodeNumber, DateTime firstAired) episodeTuple) private Episode GetExistingEpisode(IEnumerable<Episode> existingEpisodes, IReadOnlyDictionary<int, int> seasonCounts, (int seasonNumber, int episodeNumber, DateTime firstAired) episodeTuple)
{ {
var seasonNumber = episodeTuple.seasonNumber; var seasonNumber = episodeTuple.seasonNumber;
var episodeNumber = episodeTuple.episodeNumber; var episodeNumber = episodeTuple.episodeNumber;
@ -380,9 +381,6 @@ namespace MediaBrowser.Providers.TV
} }
private Episode GetExistingEpisode(IEnumerable<Episode> existingEpisodes, int season, int episode) private Episode GetExistingEpisode(IEnumerable<Episode> existingEpisodes, int season, int episode)
{ => existingEpisodes.FirstOrDefault(i => i.ParentIndexNumber == season && i.ContainsEpisodeNumber(episode));
return existingEpisodes
.FirstOrDefault(i => i.ParentIndexNumber == season && i.ContainsEpisodeNumber(episode));
}
} }
} }

View file

@ -15,6 +15,17 @@ namespace MediaBrowser.Providers.TV
{ {
public class SeasonMetadataService : MetadataService<Season, SeasonInfo> public class SeasonMetadataService : MetadataService<Season, SeasonInfo>
{ {
public SeasonMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override ItemUpdateType BeforeSaveInternal(Season item, bool isFullRefresh, ItemUpdateType currentUpdateType) protected override ItemUpdateType BeforeSaveInternal(Season item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{ {
var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType); var updateType = base.BeforeSaveInternal(item, isFullRefresh, currentUpdateType);
@ -54,13 +65,14 @@ namespace MediaBrowser.Providers.TV
return updateType; return updateType;
} }
/// <inheritdoc />
protected override bool EnableUpdatingPremiereDateFromChildren => true; protected override bool EnableUpdatingPremiereDateFromChildren => true;
/// <inheritdoc />
protected override IList<BaseItem> GetChildrenForMetadataUpdates(Season item) protected override IList<BaseItem> GetChildrenForMetadataUpdates(Season item)
{ => item.GetEpisodes();
return item.GetEpisodes();
}
/// <inheritdoc />
protected override ItemUpdateType UpdateMetadataFromChildren(Season item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType) protected override ItemUpdateType UpdateMetadataFromChildren(Season item, IList<BaseItem> children, bool isFullRefresh, ItemUpdateType currentUpdateType)
{ {
var updateType = base.UpdateMetadataFromChildren(item, children, isFullRefresh, currentUpdateType); var updateType = base.UpdateMetadataFromChildren(item, children, isFullRefresh, currentUpdateType);
@ -73,6 +85,7 @@ namespace MediaBrowser.Providers.TV
return updateType; return updateType;
} }
/// <inheritdoc />
protected override void MergeData(MetadataResult<Season> source, MetadataResult<Season> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Season> source, MetadataResult<Season> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
@ -90,9 +103,5 @@ namespace MediaBrowser.Providers.TV
return ItemUpdateType.None; return ItemUpdateType.None;
} }
public SeasonMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -24,22 +24,21 @@ namespace MediaBrowser.Providers.TV
ILogger logger, ILogger logger,
IProviderManager providerManager, IProviderManager providerManager,
IFileSystem fileSystem, IFileSystem fileSystem,
IUserDataManager userDataManager,
ILibraryManager libraryManager, ILibraryManager libraryManager,
ILocalizationManager localization, ILocalizationManager localization,
TvDbClientManager tvDbClientManager TvDbClientManager tvDbClientManager)
) : base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{ {
_localization = localization; _localization = localization;
_tvDbClientManager = tvDbClientManager; _tvDbClientManager = tvDbClientManager;
} }
/// <inheritdoc />
protected override async Task AfterMetadataRefresh(Series item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) protected override async Task AfterMetadataRefresh(Series item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken)
{ {
await base.AfterMetadataRefresh(item, refreshOptions, cancellationToken).ConfigureAwait(false); await base.AfterMetadataRefresh(item, refreshOptions, cancellationToken).ConfigureAwait(false);
var seasonProvider = new DummySeasonProvider(ServerConfigurationManager, Logger, _localization, LibraryManager, FileSystem); var seasonProvider = new DummySeasonProvider(Logger, _localization, LibraryManager, FileSystem);
await seasonProvider.Run(item, cancellationToken).ConfigureAwait(false); await seasonProvider.Run(item, cancellationToken).ConfigureAwait(false);
// TODO why does it not register this itself omg // TODO why does it not register this itself omg
@ -60,6 +59,7 @@ namespace MediaBrowser.Providers.TV
} }
} }
/// <inheritdoc />
protected override bool IsFullLocalMetadata(Series item) protected override bool IsFullLocalMetadata(Series item)
{ {
if (string.IsNullOrWhiteSpace(item.Overview)) if (string.IsNullOrWhiteSpace(item.Overview))
@ -73,6 +73,7 @@ namespace MediaBrowser.Providers.TV
return base.IsFullLocalMetadata(item); return base.IsFullLocalMetadata(item);
} }
/// <inheritdoc />
protected override void MergeData(MetadataResult<Series> source, MetadataResult<Series> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Series> source, MetadataResult<Series> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);

View file

@ -7,57 +7,62 @@ namespace MediaBrowser.Providers.TV
{ {
public class Zap2ItExternalId : IExternalId public class Zap2ItExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "Zap2It"; public string Name => "Zap2It";
/// <inheritdoc />
public string Key => MetadataProviders.Zap2It.ToString(); public string Key => MetadataProviders.Zap2It.ToString();
/// <inheritdoc />
public string UrlFormatString => "http://tvlistings.zap2it.com/overview.html?programSeriesId={0}"; public string UrlFormatString => "http://tvlistings.zap2it.com/overview.html?programSeriesId={0}";
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is Series;
return item is Series;
}
} }
public class TvdbExternalId : IExternalId public class TvdbExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "TheTVDB"; public string Name => "TheTVDB";
/// <inheritdoc />
public string Key => MetadataProviders.Tvdb.ToString(); public string Key => MetadataProviders.Tvdb.ToString();
/// <inheritdoc />
public string UrlFormatString => TvdbUtils.TvdbBaseUrl + "?tab=series&id={0}"; public string UrlFormatString => TvdbUtils.TvdbBaseUrl + "?tab=series&id={0}";
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is Series;
return item is Series;
}
} }
public class TvdbSeasonExternalId : IExternalId public class TvdbSeasonExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "TheTVDB"; public string Name => "TheTVDB";
/// <inheritdoc />
public string Key => MetadataProviders.Tvdb.ToString(); public string Key => MetadataProviders.Tvdb.ToString();
/// <inheritdoc />
public string UrlFormatString => null; public string UrlFormatString => null;
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is Season;
return item is Season;
}
} }
public class TvdbEpisodeExternalId : IExternalId public class TvdbEpisodeExternalId : IExternalId
{ {
/// <inheritdoc />
public string Name => "TheTVDB"; public string Name => "TheTVDB";
/// <inheritdoc />
public string Key => MetadataProviders.Tvdb.ToString(); public string Key => MetadataProviders.Tvdb.ToString();
/// <inheritdoc />
public string UrlFormatString => TvdbUtils.TvdbBaseUrl + "?tab=episode&id={0}"; public string UrlFormatString => TvdbUtils.TvdbBaseUrl + "?tab=episode&id={0}";
public bool Supports(IHasProviderIds item) /// <inheritdoc />
{ public bool Supports(IHasProviderIds item) => item is Episode;
return item is Episode;
}
} }
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Users
{ {
public class UserMetadataService : MetadataService<User, ItemLookupInfo> public class UserMetadataService : MetadataService<User, ItemLookupInfo>
{ {
public UserMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<User> source, MetadataResult<User> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<User> source, MetadataResult<User> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public UserMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -11,16 +11,24 @@ namespace MediaBrowser.Providers.Videos
{ {
public class VideoMetadataService : MetadataService<Video, ItemLookupInfo> public class VideoMetadataService : MetadataService<Video, ItemLookupInfo>
{ {
public VideoMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
// Make sure the type-specific services get picked first // Make sure the type-specific services get picked first
public override int Order => 10; public override int Order => 10;
/// <inheritdoc />
protected override void MergeData(MetadataResult<Video> source, MetadataResult<Video> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Video> source, MetadataResult<Video> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public VideoMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }

View file

@ -11,13 +11,20 @@ namespace MediaBrowser.Providers.Years
{ {
public class YearMetadataService : MetadataService<Year, ItemLookupInfo> public class YearMetadataService : MetadataService<Year, ItemLookupInfo>
{ {
public YearMetadataService(
IServerConfigurationManager serverConfigurationManager,
ILogger logger,
IProviderManager providerManager,
IFileSystem fileSystem,
ILibraryManager libraryManager)
: base(serverConfigurationManager, logger, providerManager, fileSystem, libraryManager)
{
}
/// <inheritdoc />
protected override void MergeData(MetadataResult<Year> source, MetadataResult<Year> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings) protected override void MergeData(MetadataResult<Year> source, MetadataResult<Year> target, MetadataFields[] lockedFields, bool replaceData, bool mergeMetadataSettings)
{ {
ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings);
} }
public YearMetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) : base(serverConfigurationManager, logger, providerManager, fileSystem, userDataManager, libraryManager)
{
}
} }
} }