mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-06-23 15:30:34 -04:00
Adding handling of provider's logo locally
This commit is contained in:
parent
42ff22ad13
commit
fdf2f37ceb
@ -9,6 +9,7 @@ namespace Kyoo.Controllers
|
||||
Task<Show> Validate(Show show, bool alwaysDownload = false);
|
||||
Task<Season> Validate(Season season, bool alwaysDownload = false);
|
||||
Task<Episode> Validate(Episode episode, bool alwaysDownload = false);
|
||||
Task<IEnumerable<PeopleRole>> Validate(IEnumerable<PeopleRole> actors, bool alwaysDownload = false);
|
||||
Task<People> Validate(People actors, bool alwaysDownload = false);
|
||||
Task<ProviderID> Validate(ProviderID actors, bool alwaysDownload = false);
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ namespace Kyoo.Models
|
||||
public int ID { get; set; }
|
||||
public string Slug { get; set; }
|
||||
public string Name { get; set; }
|
||||
[SerializeAs("{HOST}/api/library/{Slug}/poster")] public string Poster { get; set; }
|
||||
[SerializeAs("{HOST}/api/collection/{Slug}/poster")] public string Poster { get; set; }
|
||||
public string Overview { get; set; }
|
||||
[LoadableRelation] public virtual ICollection<Show> Shows { get; set; }
|
||||
[LoadableRelation] public virtual ICollection<Library> Libraries { get; set; }
|
||||
|
@ -8,7 +8,7 @@ namespace Kyoo.Models
|
||||
public int ID { get; set; }
|
||||
public string Slug { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Logo { get; set; }
|
||||
[SerializeAs("{HOST}/api/providers/{Slug}/logo")] public string Logo { get; set; }
|
||||
|
||||
[LoadableRelation] public virtual ICollection<Library> Libraries { get; set; }
|
||||
|
||||
|
@ -110,7 +110,7 @@ namespace Kyoo.Controllers
|
||||
_tasks.AddRange(CoreTaskHolder.Tasks.Select(x => (x, DateTime.Now + GetTaskDelay(x.Slug))));
|
||||
|
||||
IEnumerable<ITask> prerunTasks = _tasks.Select(x => x.task)
|
||||
.Where(x => x.RunOnStartup && x.Priority == Int32.MaxValue);
|
||||
.Where(x => x.RunOnStartup && x.Priority == int.MaxValue);
|
||||
|
||||
foreach (ITask task in prerunTasks)
|
||||
task.Run(_serviceProvider, _taskToken.Token);
|
||||
|
@ -1,10 +1,10 @@
|
||||
using Kyoo.Models;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace Kyoo.Controllers
|
||||
{
|
||||
@ -26,7 +26,7 @@ namespace Kyoo.Controllers
|
||||
}
|
||||
catch (WebException exception)
|
||||
{
|
||||
await Console.Error.WriteLineAsync($"{what} could not be downloaded.\n\tError: {exception.Message}.");
|
||||
await Console.Error.WriteLineAsync($"{what} could not be downloaded. Error: {exception.Message}.");
|
||||
}
|
||||
}
|
||||
|
||||
@ -54,25 +54,22 @@ namespace Kyoo.Controllers
|
||||
await DownloadImage(show.Backdrop, backdropPath, $"The backdrop of {show.Title}");
|
||||
}
|
||||
|
||||
foreach (PeopleRole role in show.People)
|
||||
await Validate(role.People, alwaysDownload);
|
||||
|
||||
return show;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<PeopleRole>> Validate(IEnumerable<PeopleRole> people, bool alwaysDownload)
|
||||
public async Task<People> Validate([NotNull] People people, bool alwaysDownload)
|
||||
{
|
||||
if (people == null)
|
||||
return null;
|
||||
|
||||
throw new ArgumentNullException(nameof(people));
|
||||
string root = _config.GetValue<string>("peoplePath");
|
||||
Directory.CreateDirectory(root);
|
||||
string localPath = Path.Combine(root, people.Slug + ".jpg");
|
||||
|
||||
foreach (PeopleRole peop in people)
|
||||
{
|
||||
string localPath = Path.Combine(root, peop.People.Slug + ".jpg");
|
||||
if (peop.People.Poster == null)
|
||||
continue;
|
||||
Directory.CreateDirectory(root);
|
||||
if (alwaysDownload || !File.Exists(localPath))
|
||||
await DownloadImage(peop.People.Poster, localPath, $"The profile picture of {peop.People.Name}");
|
||||
}
|
||||
await DownloadImage(people.Poster, localPath, $"The profile picture of {people.Name}");
|
||||
|
||||
return people;
|
||||
}
|
||||
@ -100,9 +97,25 @@ namespace Kyoo.Controllers
|
||||
{
|
||||
string localPath = Path.ChangeExtension(episode.Path, "jpg");
|
||||
if (alwaysDownload || !File.Exists(localPath))
|
||||
await DownloadImage(episode.Thumb, localPath, $"The thumbnail of {episode.Show.Title}");
|
||||
await DownloadImage(episode.Thumb, localPath, $"The thumbnail of {episode.Slug}");
|
||||
}
|
||||
return episode;
|
||||
}
|
||||
|
||||
public async Task<ProviderID> Validate(ProviderID provider, bool alwaysDownload)
|
||||
{
|
||||
if (provider.Logo == null)
|
||||
return provider;
|
||||
|
||||
string root = _config.GetValue<string>("peoplePath");
|
||||
string localPath = Path.Combine(root, provider.Slug + ".jpg");
|
||||
|
||||
Directory.CreateDirectory(root);
|
||||
if (alwaysDownload || !File.Exists(localPath))
|
||||
await DownloadImage(provider.Logo, localPath, $"The thumbnail of {provider.Slug}");
|
||||
return provider;
|
||||
}
|
||||
|
||||
//TODO add get thumbs here
|
||||
}
|
||||
}
|
||||
|
@ -43,6 +43,10 @@ namespace Kyoo
|
||||
{
|
||||
configuration.RootPath = Path.Join(AppDomain.CurrentDomain.BaseDirectory, "wwwroot");
|
||||
});
|
||||
services.AddResponseCompression(x =>
|
||||
{
|
||||
x.EnableForHttps = true;
|
||||
});
|
||||
|
||||
services.AddControllers()
|
||||
.AddNewtonsoftJson(x =>
|
||||
@ -187,6 +191,19 @@ namespace Kyoo
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
// app.Use((ctx, next) =>
|
||||
// {
|
||||
// ctx.Response.Headers.Remove("X-Powered-By");
|
||||
// ctx.Response.Headers.Remove("Server");
|
||||
// ctx.Response.Headers.Add("Feature-Policy", "autoplay 'self'; fullscreen");
|
||||
// ctx.Response.Headers.Add("Content-Security-Policy", "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'");
|
||||
// ctx.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
|
||||
// ctx.Response.Headers.Add("Referrer-Policy", "no-referrer");
|
||||
// ctx.Response.Headers.Add("Access-Control-Allow-Origin", "null");
|
||||
// ctx.Response.Headers.Add("X-Content-Type-Options", "nosniff");
|
||||
// return next();
|
||||
// });
|
||||
app.UseResponseCompression();
|
||||
app.UseCookiePolicy(new CookiePolicyOptions
|
||||
{
|
||||
MinimumSameSitePolicy = SameSiteMode.Strict
|
||||
|
@ -291,7 +291,6 @@ namespace Kyoo.Controllers
|
||||
show.Slug += $"-{show.StartYear}";
|
||||
await libraryManager.RegisterShow(show);
|
||||
}
|
||||
await _thumbnailsManager.Validate(show.People);
|
||||
await _thumbnailsManager.Validate(show);
|
||||
return show;
|
||||
}
|
||||
|
@ -72,6 +72,7 @@ namespace Kyoo.Tasks
|
||||
{
|
||||
if (thumbs)
|
||||
await _thumbnails!.Validate(show, true);
|
||||
await _library.Load(show, x => x.Seasons);
|
||||
foreach (Season season in show.Seasons)
|
||||
{
|
||||
if (token.IsCancellationRequested)
|
||||
@ -84,6 +85,7 @@ namespace Kyoo.Tasks
|
||||
{
|
||||
if (thumbs)
|
||||
await _thumbnails!.Validate(season, true);
|
||||
await _library.Load(season, x => x.Episodes);
|
||||
foreach (Episode episode in season.Episodes)
|
||||
{
|
||||
if (token.IsCancellationRequested)
|
||||
|
@ -21,13 +21,15 @@ namespace Kyoo.Tasks
|
||||
{
|
||||
using IServiceScope serviceScope = serviceProvider.CreateScope();
|
||||
IProviderRepository providers = serviceScope.ServiceProvider.GetService<IProviderRepository>();
|
||||
IThumbnailsManager thumbnails = serviceScope.ServiceProvider.GetService<IThumbnailsManager>();
|
||||
IPluginManager pluginManager = serviceScope.ServiceProvider.GetService<IPluginManager>();
|
||||
|
||||
foreach (IMetadataProvider provider in pluginManager.GetPlugins<IMetadataProvider>())
|
||||
foreach (IMetadataProvider provider in pluginManager!.GetPlugins<IMetadataProvider>())
|
||||
{
|
||||
if (string.IsNullOrEmpty(provider.Provider.Slug))
|
||||
throw new ArgumentException($"Empty provider slug (name: {provider.Provider.Name}).");
|
||||
await providers.CreateIfNotExists(provider.Provider);
|
||||
await providers!.CreateIfNotExists(provider.Provider);
|
||||
await thumbnails!.Validate(provider.Provider);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Kyoo.CommonApi;
|
||||
using Kyoo.Controllers;
|
||||
using Kyoo.Models;
|
||||
@ -14,11 +16,32 @@ namespace Kyoo.Api
|
||||
public class ProviderAPI : CrudApi<ProviderID>
|
||||
{
|
||||
private readonly ILibraryManager _libraryManager;
|
||||
private readonly string _providerPath;
|
||||
|
||||
public ProviderAPI(ILibraryManager libraryManager, IConfiguration config)
|
||||
: base(libraryManager.ProviderRepository, config)
|
||||
{
|
||||
_libraryManager = libraryManager;
|
||||
_providerPath = Path.GetFullPath(config.GetValue<string>("providerPath"));
|
||||
}
|
||||
|
||||
[HttpGet("{id:int}/logo")]
|
||||
[Authorize(Policy="Read")]
|
||||
public async Task<IActionResult> GetLogo(int id)
|
||||
{
|
||||
string slug = (await _libraryManager.GetPeople(id)).Slug;
|
||||
return GetLogo(slug);
|
||||
}
|
||||
|
||||
[HttpGet("{slug}/logo")]
|
||||
[Authorize(Policy="Read")]
|
||||
public IActionResult GetLogo(string slug)
|
||||
{
|
||||
string thumbPath = Path.GetFullPath(Path.Combine(_providerPath, slug + ".jpg"));
|
||||
if (!thumbPath.StartsWith(_providerPath) || !System.IO.File.Exists(thumbPath))
|
||||
return NotFound();
|
||||
|
||||
return new PhysicalFileResult(Path.GetFullPath(thumbPath), "image/jpg");
|
||||
}
|
||||
}
|
||||
}
|
@ -29,6 +29,7 @@
|
||||
"transmuxTempPath": "cached/kyoo/transmux",
|
||||
"transcodeTempPath": "cached/kyoo/transcode",
|
||||
"peoplePath": "people",
|
||||
"providerPath": "providers",
|
||||
"profilePicturePath": "users/",
|
||||
"plugins": "plugins/",
|
||||
"defaultPermissions": "read,play,write,admin",
|
||||
|
Loading…
x
Reference in New Issue
Block a user