mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-20 09:04:42 +01:00
added more image providers
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Controller;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Controller.Entities.Movies;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Resolvers;
|
||||
|
||||
@@ -192,6 +192,7 @@
|
||||
<Compile Include="Roku\RokuControllerFactory.cs" />
|
||||
<Compile Include="ScheduledTasks\PeopleValidationTask.cs" />
|
||||
<Compile Include="ScheduledTasks\ChapterImagesTask.cs" />
|
||||
<Compile Include="ScheduledTasks\RefreshIntrosTask.cs" />
|
||||
<Compile Include="ScheduledTasks\RefreshMediaLibraryTask.cs" />
|
||||
<Compile Include="ServerApplicationPaths.cs" />
|
||||
<Compile Include="ServerManager\ServerManager.cs" />
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
using System.IO;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@@ -17,8 +16,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
|
||||
private readonly ILogger _logger;
|
||||
|
||||
private IDbCommand _deleteInfosCommand;
|
||||
private IDbCommand _saveInfoCommand;
|
||||
private IDbCommand _saveStatusCommand;
|
||||
private readonly IApplicationPaths _appPaths;
|
||||
|
||||
@@ -48,16 +45,13 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
/// <returns>Task.</returns>
|
||||
public async Task Initialize()
|
||||
{
|
||||
var dbFile = Path.Combine(_appPaths.DataPath, "providerinfo.db");
|
||||
var dbFile = Path.Combine(_appPaths.DataPath, "refreshinfo.db");
|
||||
|
||||
_connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false);
|
||||
|
||||
string[] queries = {
|
||||
|
||||
"create table if not exists providerinfos (ItemId GUID, ProviderId GUID, ProviderVersion TEXT, FileStamp GUID, LastRefreshStatus TEXT, LastRefreshed datetime, PRIMARY KEY (ItemId, ProviderId))",
|
||||
"create index if not exists idx_providerinfos on providerinfos(ItemId, ProviderId)",
|
||||
|
||||
"create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, LastStatus TEXT, LastErrorMessage TEXT, MetadataProvidersRefreshed TEXT, ImageProvidersRefreshed TEXT)",
|
||||
"create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, ItemName TEXT, SeriesName TEXT, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, LastStatus TEXT, LastErrorMessage TEXT, MetadataProvidersRefreshed TEXT, ImageProvidersRefreshed TEXT)",
|
||||
"create index if not exists idx_MetadataStatus on MetadataStatus(ItemId)",
|
||||
|
||||
//pragmas
|
||||
@@ -73,21 +67,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
_shrinkMemoryTimer = new SqliteShrinkMemoryTimer(_connection, _writeLock, _logger);
|
||||
}
|
||||
|
||||
private static readonly string[] SaveHistoryColumns =
|
||||
{
|
||||
"ItemId",
|
||||
"ProviderId",
|
||||
"ProviderVersion",
|
||||
"FileStamp",
|
||||
"LastRefreshStatus",
|
||||
"LastRefreshed"
|
||||
};
|
||||
|
||||
private readonly string[] _historySelectColumns = SaveHistoryColumns.Skip(1).ToArray();
|
||||
|
||||
private static readonly string[] StatusColumns =
|
||||
{
|
||||
"ItemId",
|
||||
"ItemName",
|
||||
"SeriesName",
|
||||
"DateLastMetadataRefresh",
|
||||
"DateLastImagesRefresh",
|
||||
"LastStatus",
|
||||
@@ -106,21 +90,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
/// </summary>
|
||||
private void PrepareStatements()
|
||||
{
|
||||
_deleteInfosCommand = _connection.CreateCommand();
|
||||
_deleteInfosCommand.CommandText = "delete from providerinfos where ItemId=@ItemId";
|
||||
_deleteInfosCommand.Parameters.Add(_deleteInfosCommand, "@ItemId");
|
||||
|
||||
_saveInfoCommand = _connection.CreateCommand();
|
||||
|
||||
_saveInfoCommand.CommandText = string.Format("replace into providerinfos ({0}) values ({1})",
|
||||
string.Join(",", SaveHistoryColumns),
|
||||
string.Join(",", SaveHistoryColumns.Select(i => "@" + i).ToArray()));
|
||||
|
||||
foreach (var col in SaveHistoryColumns)
|
||||
{
|
||||
_saveInfoCommand.Parameters.Add(_saveInfoCommand, "@" + col);
|
||||
}
|
||||
|
||||
_saveStatusCommand = _connection.CreateCommand();
|
||||
|
||||
_saveStatusCommand.CommandText = string.Format("replace into MetadataStatus ({0}) values ({1})",
|
||||
@@ -133,132 +102,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<BaseProviderInfo> GetProviderHistory(Guid itemId)
|
||||
{
|
||||
if (itemId == Guid.Empty)
|
||||
{
|
||||
throw new ArgumentNullException("itemId");
|
||||
}
|
||||
|
||||
using (var cmd = _connection.CreateCommand())
|
||||
{
|
||||
var cmdText = "select " + string.Join(",", _historySelectColumns) + " from providerinfos where";
|
||||
|
||||
cmdText += " ItemId=@ItemId";
|
||||
cmd.Parameters.Add(cmd, "@ItemId", DbType.Guid).Value = itemId;
|
||||
|
||||
cmd.CommandText = cmdText;
|
||||
|
||||
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
yield return GetBaseProviderInfo(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the base provider information.
|
||||
/// </summary>
|
||||
/// <param name="reader">The reader.</param>
|
||||
/// <returns>BaseProviderInfo.</returns>
|
||||
private BaseProviderInfo GetBaseProviderInfo(IDataReader reader)
|
||||
{
|
||||
var item = new BaseProviderInfo
|
||||
{
|
||||
ProviderId = reader.GetGuid(0)
|
||||
};
|
||||
|
||||
if (!reader.IsDBNull(1))
|
||||
{
|
||||
item.ProviderVersion = reader.GetString(1);
|
||||
}
|
||||
|
||||
item.FileStamp = reader.GetGuid(2);
|
||||
item.LastRefreshStatus = (ProviderRefreshStatus)Enum.Parse(typeof(ProviderRefreshStatus), reader.GetString(3), true);
|
||||
item.LastRefreshed = reader.GetDateTime(4).ToUniversalTime();
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
public async Task SaveProviderHistory(Guid id, IEnumerable<BaseProviderInfo> infos, CancellationToken cancellationToken)
|
||||
{
|
||||
if (id == Guid.Empty)
|
||||
{
|
||||
throw new ArgumentNullException("id");
|
||||
}
|
||||
|
||||
if (infos == null)
|
||||
{
|
||||
throw new ArgumentNullException("infos");
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
IDbTransaction transaction = null;
|
||||
|
||||
try
|
||||
{
|
||||
transaction = _connection.BeginTransaction();
|
||||
|
||||
_deleteInfosCommand.GetParameter(0).Value = id;
|
||||
|
||||
_deleteInfosCommand.Transaction = transaction;
|
||||
|
||||
_deleteInfosCommand.ExecuteNonQuery();
|
||||
|
||||
foreach (var stream in infos)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
_saveInfoCommand.GetParameter(0).Value = id;
|
||||
_saveInfoCommand.GetParameter(1).Value = stream.ProviderId;
|
||||
_saveInfoCommand.GetParameter(2).Value = stream.ProviderVersion;
|
||||
_saveInfoCommand.GetParameter(3).Value = stream.FileStamp;
|
||||
_saveInfoCommand.GetParameter(4).Value = stream.LastRefreshStatus.ToString();
|
||||
_saveInfoCommand.GetParameter(5).Value = stream.LastRefreshed;
|
||||
|
||||
_saveInfoCommand.Transaction = transaction;
|
||||
_saveInfoCommand.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
transaction.Commit();
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
if (transaction != null)
|
||||
{
|
||||
transaction.Rollback();
|
||||
}
|
||||
|
||||
throw;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.ErrorException("Failed to save provider info:", e);
|
||||
|
||||
if (transaction != null)
|
||||
{
|
||||
transaction.Rollback();
|
||||
}
|
||||
|
||||
throw;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (transaction != null)
|
||||
{
|
||||
transaction.Dispose();
|
||||
}
|
||||
|
||||
_writeLock.Release();
|
||||
}
|
||||
}
|
||||
|
||||
public MetadataStatus GetMetadataStatus(Guid itemId)
|
||||
{
|
||||
if (itemId == Guid.Empty)
|
||||
@@ -296,32 +139,42 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
|
||||
if (!reader.IsDBNull(1))
|
||||
{
|
||||
result.DateLastMetadataRefresh = reader.GetDateTime(1).ToUniversalTime();
|
||||
result.ItemName = reader.GetString(1);
|
||||
}
|
||||
|
||||
if (!reader.IsDBNull(2))
|
||||
{
|
||||
result.DateLastImagesRefresh = reader.GetDateTime(2).ToUniversalTime();
|
||||
result.SeriesName = reader.GetString(2);
|
||||
}
|
||||
|
||||
if (!reader.IsDBNull(3))
|
||||
{
|
||||
result.LastStatus = (ProviderRefreshStatus)Enum.Parse(typeof(ProviderRefreshStatus), reader.GetString(3), true);
|
||||
result.DateLastMetadataRefresh = reader.GetDateTime(3).ToUniversalTime();
|
||||
}
|
||||
|
||||
if (!reader.IsDBNull(4))
|
||||
{
|
||||
result.LastErrorMessage = reader.GetString(4);
|
||||
result.DateLastImagesRefresh = reader.GetDateTime(4).ToUniversalTime();
|
||||
}
|
||||
|
||||
if (!reader.IsDBNull(5))
|
||||
{
|
||||
result.MetadataProvidersRefreshed = reader.GetString(5).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList();
|
||||
result.LastStatus = (ProviderRefreshStatus)Enum.Parse(typeof(ProviderRefreshStatus), reader.GetString(5), true);
|
||||
}
|
||||
|
||||
if (!reader.IsDBNull(6))
|
||||
{
|
||||
result.ImageProvidersRefreshed = reader.GetString(6).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList();
|
||||
result.LastErrorMessage = reader.GetString(6);
|
||||
}
|
||||
|
||||
if (!reader.IsDBNull(7))
|
||||
{
|
||||
result.MetadataProvidersRefreshed = reader.GetString(7).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList();
|
||||
}
|
||||
|
||||
if (!reader.IsDBNull(8))
|
||||
{
|
||||
result.ImageProvidersRefreshed = reader.GetString(8).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList();
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -345,12 +198,14 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||
transaction = _connection.BeginTransaction();
|
||||
|
||||
_saveStatusCommand.GetParameter(0).Value = status.ItemId;
|
||||
_saveStatusCommand.GetParameter(1).Value = status.DateLastMetadataRefresh;
|
||||
_saveStatusCommand.GetParameter(2).Value = status.DateLastImagesRefresh;
|
||||
_saveStatusCommand.GetParameter(3).Value = status.LastStatus.ToString();
|
||||
_saveStatusCommand.GetParameter(4).Value = status.LastErrorMessage;
|
||||
_saveStatusCommand.GetParameter(5).Value = string.Join("|", status.MetadataProvidersRefreshed.ToArray());
|
||||
_saveStatusCommand.GetParameter(6).Value = string.Join("|", status.ImageProvidersRefreshed.ToArray());
|
||||
_saveStatusCommand.GetParameter(1).Value = status.ItemName;
|
||||
_saveStatusCommand.GetParameter(2).Value = status.SeriesName;
|
||||
_saveStatusCommand.GetParameter(3).Value = status.DateLastMetadataRefresh;
|
||||
_saveStatusCommand.GetParameter(4).Value = status.DateLastImagesRefresh;
|
||||
_saveStatusCommand.GetParameter(5).Value = status.LastStatus.ToString();
|
||||
_saveStatusCommand.GetParameter(6).Value = status.LastErrorMessage;
|
||||
_saveStatusCommand.GetParameter(7).Value = string.Join("|", status.MetadataProvidersRefreshed.ToArray());
|
||||
_saveStatusCommand.GetParameter(8).Value = string.Join("|", status.ImageProvidersRefreshed.ToArray());
|
||||
|
||||
_saveStatusCommand.Transaction = transaction;
|
||||
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Server.Implementations.ScheduledTasks
|
||||
{
|
||||
/// <summary>
|
||||
/// Class RefreshIntrosTask
|
||||
/// </summary>
|
||||
public class RefreshIntrosTask : ILibraryPostScanTask
|
||||
{
|
||||
/// <summary>
|
||||
/// The _library manager
|
||||
/// </summary>
|
||||
private readonly ILibraryManager _libraryManager;
|
||||
/// <summary>
|
||||
/// The _logger
|
||||
/// </summary>
|
||||
private readonly ILogger _logger;
|
||||
|
||||
private readonly IFileSystem _fileSystem;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="RefreshIntrosTask" /> class.
|
||||
/// </summary>
|
||||
/// <param name="libraryManager">The library manager.</param>
|
||||
/// <param name="logger">The logger.</param>
|
||||
/// <param name="fileSystem">The file system.</param>
|
||||
public RefreshIntrosTask(ILibraryManager libraryManager, ILogger logger, IFileSystem fileSystem)
|
||||
{
|
||||
_libraryManager = libraryManager;
|
||||
_logger = logger;
|
||||
_fileSystem = fileSystem;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runs the specified progress.
|
||||
/// </summary>
|
||||
/// <param name="progress">The progress.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
|
||||
{
|
||||
var files = _libraryManager.GetAllIntroFiles().ToList();
|
||||
|
||||
var numComplete = 0;
|
||||
|
||||
foreach (var file in files)
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
try
|
||||
{
|
||||
await RefreshIntro(file, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
throw;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.ErrorException("Error refreshing intro {0}", ex, file);
|
||||
}
|
||||
|
||||
numComplete++;
|
||||
double percent = numComplete;
|
||||
percent /= files.Count;
|
||||
progress.Report(percent * 100);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Refreshes the intro.
|
||||
/// </summary>
|
||||
/// <param name="path">The path.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
private async Task RefreshIntro(string path, CancellationToken cancellationToken)
|
||||
{
|
||||
var item = _libraryManager.ResolvePath(_fileSystem.GetFileSystemInfo(path));
|
||||
|
||||
if (item == null)
|
||||
{
|
||||
_logger.Error("Intro resolver returned null for {0}", path);
|
||||
return;
|
||||
}
|
||||
|
||||
var dbItem = _libraryManager.GetItemById(item.Id);
|
||||
|
||||
if (dbItem != null)
|
||||
{
|
||||
item = dbItem;
|
||||
}
|
||||
|
||||
// Force the save if it's a new item
|
||||
await item.RefreshMetadata(cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using MediaBrowser.Common.Implementations;
|
||||
using System;
|
||||
using MediaBrowser.Common.Implementations;
|
||||
using MediaBrowser.Controller;
|
||||
using System.IO;
|
||||
|
||||
@@ -213,18 +214,6 @@ namespace MediaBrowser.Server.Implementations
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the images data path.
|
||||
/// </summary>
|
||||
/// <value>The images data path.</value>
|
||||
public string DownloadedImagesDataPath
|
||||
{
|
||||
get
|
||||
{
|
||||
return Path.Combine(DataPath, "remote-images");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the artists path.
|
||||
/// </summary>
|
||||
@@ -249,5 +238,20 @@ namespace MediaBrowser.Server.Implementations
|
||||
return Path.Combine(ItemsByNamePath, "GameGenre");
|
||||
}
|
||||
}
|
||||
|
||||
public string InternalMetadataPath
|
||||
{
|
||||
get
|
||||
{
|
||||
return Path.Combine(DataPath, "metadata");
|
||||
}
|
||||
}
|
||||
|
||||
public string GetInternalMetadataPath(Guid id)
|
||||
{
|
||||
var idString = id.ToString("N");
|
||||
|
||||
return Path.Combine(InternalMetadataPath, idString.Substring(0, 2), idString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user