mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-24 02:02:36 -04:00
Starting to implement a dispose pattern for the library manager/repositories
This commit is contained in:
parent
b0eab43d52
commit
d34a6fd75a
@ -1,11 +1,12 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using JetBrains.Annotations;
|
||||
using Kyoo.Models;
|
||||
|
||||
namespace Kyoo.Controllers
|
||||
{
|
||||
public interface ILibraryManager
|
||||
public interface ILibraryManager : IDisposable, IAsyncDisposable
|
||||
{
|
||||
// Get by slug
|
||||
Task<Library> GetLibrary(string slug);
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using JetBrains.Annotations;
|
||||
@ -5,7 +6,7 @@ using Kyoo.Models;
|
||||
|
||||
namespace Kyoo.Controllers
|
||||
{
|
||||
public interface IRepository<T>
|
||||
public interface IRepository<T> : IDisposable, IAsyncDisposable
|
||||
{
|
||||
Task<T> Get(int id);
|
||||
Task<T> Get(string slug);
|
||||
|
14
Kyoo.Common/Models/Exceptions/DuplicatedItemException.cs
Normal file
14
Kyoo.Common/Models/Exceptions/DuplicatedItemException.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
|
||||
namespace Kyoo.Models.Exceptions
|
||||
{
|
||||
public class DuplicatedItemException : Exception
|
||||
{
|
||||
public override string Message { get; }
|
||||
|
||||
public DuplicatedItemException(string message)
|
||||
{
|
||||
Message = message;
|
||||
}
|
||||
}
|
||||
}
|
@ -40,6 +40,28 @@ namespace Kyoo.Controllers
|
||||
_providers = providers;
|
||||
_people = people;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_libraries?.Dispose();
|
||||
_collections?.Dispose();
|
||||
_shows?.Dispose();
|
||||
_seasons?.Dispose();
|
||||
_episodes?.Dispose();
|
||||
_tracks?.Dispose();
|
||||
_genres?.Dispose();
|
||||
_studios?.Dispose();
|
||||
_people?.Dispose();
|
||||
_providers?.Dispose();
|
||||
}
|
||||
|
||||
public async ValueTask DisposeAsync()
|
||||
{
|
||||
return ValueTask.(new []
|
||||
{
|
||||
_libraries.DisposeAsync()
|
||||
});
|
||||
}
|
||||
|
||||
public Task<Library> GetLibrary(string slug)
|
||||
{
|
||||
|
@ -5,6 +5,7 @@ using System.Threading.Tasks;
|
||||
using Kyoo.Models;
|
||||
using Kyoo.Models.Exceptions;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Npgsql;
|
||||
|
||||
namespace Kyoo.Controllers
|
||||
{
|
||||
@ -45,9 +46,19 @@ namespace Kyoo.Controllers
|
||||
{
|
||||
if (obj == null)
|
||||
throw new ArgumentNullException(nameof(obj));
|
||||
|
||||
await _database.Collections.AddAsync(obj);
|
||||
await _database.SaveChangesAsync();
|
||||
|
||||
try
|
||||
{
|
||||
await _database.Collections.AddAsync(obj);
|
||||
await _database.SaveChangesAsync();
|
||||
}
|
||||
catch (DbUpdateException ex)
|
||||
{
|
||||
if (ex.InnerException is PostgresException inner && inner.SqlState == PostgresErrorCodes.UniqueViolation)
|
||||
throw new DuplicatedItemException($"Trying to insert a duplicated collection (slug {obj.Slug} already exists).");
|
||||
throw;
|
||||
}
|
||||
|
||||
return obj.ID;
|
||||
}
|
||||
|
||||
@ -59,7 +70,17 @@ namespace Kyoo.Controllers
|
||||
Collection old = await Get(obj.Slug);
|
||||
if (old != null)
|
||||
return old.ID;
|
||||
return await Create(obj);
|
||||
try
|
||||
{
|
||||
return await Create(obj);
|
||||
}
|
||||
catch (DuplicatedItemException)
|
||||
{
|
||||
old = await Get(obj.Slug);
|
||||
if (old == null)
|
||||
throw new SystemException("Unknown database state.");
|
||||
return old.ID;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task Edit(Collection edited, bool resetOld)
|
||||
|
@ -63,6 +63,10 @@ namespace Kyoo.Controllers
|
||||
await libraryManager.DeleteEpisode(episode);
|
||||
}
|
||||
|
||||
// TODO replace this grotesque way to load the providers.
|
||||
foreach (Library library in libraries)
|
||||
library.Providers = library.Providers;
|
||||
|
||||
await Task.WhenAll(libraries.Select(x => Scan(x, episodes, cancellationToken)));
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -72,7 +76,7 @@ namespace Kyoo.Controllers
|
||||
Console.WriteLine("Scan finished!");
|
||||
}
|
||||
|
||||
private Task Scan(Library library, ICollection<Episode> episodes, CancellationToken cancellationToken)
|
||||
private Task Scan(Library library, IEnumerable<Episode> episodes, CancellationToken cancellationToken)
|
||||
{
|
||||
Console.WriteLine($"Scanning library {library.Name} at {string.Join(", ", library.Paths)}.");
|
||||
return Task.WhenAll(library.Paths.Select(async path =>
|
||||
@ -106,16 +110,16 @@ namespace Kyoo.Controllers
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
// return Task.WhenAll(files.Select(file =>
|
||||
foreach (string file in files)
|
||||
return Task.WhenAll(files.Select(file =>
|
||||
//foreach (string file in files)
|
||||
{
|
||||
if (!IsVideo(file) || episodes.Any(x => x.Path == file))
|
||||
continue; //return Task.CompletedTask;
|
||||
/*continue;*/ return Task.CompletedTask;
|
||||
string relativePath = file.Substring(path.Length);
|
||||
/*return*/ await RegisterFile(file, relativePath, library, cancellationToken);
|
||||
}//));
|
||||
return /*await*/ RegisterFile(file, relativePath, library, cancellationToken);
|
||||
}));
|
||||
|
||||
return Task.CompletedTask;
|
||||
// return Task.CompletedTask;
|
||||
}));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user