Vanguard media stack: ingest, copyparty, Syncthing, normalize sweep, Authentik, Jellyfin + Vanguard Metadata plugin, MariaDB, Gitea, bot runtime

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-10-30 15:43:30 -05:00
commit c602a6ff52
66 changed files with 4229 additions and 0 deletions

View File

@@ -0,0 +1,31 @@
using MediaBrowser.Controller.Library;
namespace Jellyfin.Plugin.Vanguard.Services;
/// <summary>Splits a media path into (series folder, dock title or null, file stem) relative to its library root.</summary>
public sealed class LibraryPaths
{
private readonly ILibraryManager _library;
public LibraryPaths(ILibraryManager library) { _library = library; }
public sealed record Parts(string SeriesFolder, string? Title, string Stem);
public Parts? Split(string path)
{
var full = Path.GetFullPath(path);
string? root = null;
foreach (var vf in _library.GetVirtualFolders())
{
foreach (var loc in vf.Locations ?? [])
{
var l = Path.GetFullPath(loc).TrimEnd(Path.DirectorySeparatorChar);
if (full.StartsWith(l + Path.DirectorySeparatorChar, StringComparison.Ordinal) && (root is null || l.Length > root.Length)) root = l;
}
}
if (root is null) return null;
var rel = full[(root.Length + 1)..].Split(Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries);
if (rel.Length < 2) return null;
var stem = Path.GetFileNameWithoutExtension(rel[^1]);
return rel.Length >= 3 ? new Parts(rel[0], rel[^2], stem) : new Parts(rel[0], null, stem);
}
}