Nest all platforms under channels_root (was: siblings)
Previously platform_root resolved YouTube to channels_root verbatim and
non-YouTube to siblings under channels_root.parent(). That assumed the
user's library was split across two levels:
/library/yt-offline/ ← config.backup.directory (YouTube)
/library/bandcamp/ ← sibling
/library/tiktok/ ← sibling
In practice users (myself included) keep everything under one umbrella:
/library/yt-offline/
channels/ ← YouTube
bandcamp/
tiktok/
music/
…
Make that the canonical layout. platform_root now returns
channels_root.join(dir_name) for every platform including YouTube
(which keeps its `channels` dir_name for back-compat with existing
on-disk trees that already have the channels/ subdir populated).
library_root is now == channels_root in both app.rs and web.rs — the
two-level concept is gone. The field stays as a distinct name so
file_url() and the /files/ static-file mount keep working without
churn at every call site. music_root and music dir also moved from
channels_root.with_file_name("music") to channels_root.join("music").
Tests in platform.rs updated to the new layout. 74 pass.
Note: this is a breaking change for installs that had the sibling
layout. The fix is to mv the platform dirs into the channels_root.
The next commit walks the user through that for my install.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
4cead6cf93
commit
4f15ab873f
4 changed files with 37 additions and 30 deletions
|
|
@ -351,15 +351,20 @@ fn extract_after<'a>(url: &'a str, marker: &str) -> Option<&'a str> {
|
|||
|
||||
// ── Filesystem layout ─────────────────────────────────────────────────────────
|
||||
|
||||
/// Absolute path to a given platform's video folder, derived from the
|
||||
/// configured YouTube `channels_root` (its parent is treated as the
|
||||
/// implicit library root, with each platform as a sibling folder).
|
||||
/// Absolute path to a given platform's video folder.
|
||||
///
|
||||
/// All platforms (including YouTube) are nested as subdirectories of the
|
||||
/// configured `channels_root`. So a config with
|
||||
/// `directory = "/mnt/library/yt-offline"` puts YouTube channels at
|
||||
/// `/mnt/library/yt-offline/channels/<creator>/` and Bandcamp artists at
|
||||
/// `/mnt/library/yt-offline/bandcamp/<artist>/`. This keeps everything a
|
||||
/// user might want to archive under one tidy umbrella directory.
|
||||
///
|
||||
/// The function's name predates the layout change — `channels_root` is
|
||||
/// really "library root" now, but renaming would touch ~40 call sites
|
||||
/// for no functional benefit.
|
||||
pub fn platform_root(channels_root: &Path, platform: Platform) -> PathBuf {
|
||||
if platform == Platform::YouTube {
|
||||
// YouTube keeps the legacy path verbatim.
|
||||
return channels_root.to_path_buf();
|
||||
}
|
||||
channels_root.with_file_name(platform.dir_name())
|
||||
channels_root.join(platform.dir_name())
|
||||
}
|
||||
|
||||
/// Where the `.source-url` sidecar lives for a creator folder.
|
||||
|
|
@ -486,16 +491,16 @@ mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn platform_root_youtube_is_channels_root() {
|
||||
let cr = Path::new("/foo/channels");
|
||||
assert_eq!(platform_root(cr, Platform::YouTube), cr);
|
||||
fn platform_root_youtube_nests_as_channels_subdir() {
|
||||
let cr = Path::new("/foo/library");
|
||||
assert_eq!(platform_root(cr, Platform::YouTube), Path::new("/foo/library/channels"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn platform_root_others_are_siblings() {
|
||||
let cr = Path::new("/foo/channels");
|
||||
assert_eq!(platform_root(cr, Platform::TikTok), Path::new("/foo/tiktok"));
|
||||
assert_eq!(platform_root(cr, Platform::Twitch), Path::new("/foo/twitch"));
|
||||
fn platform_root_others_nest_too() {
|
||||
let cr = Path::new("/foo/library");
|
||||
assert_eq!(platform_root(cr, Platform::TikTok), Path::new("/foo/library/tiktok"));
|
||||
assert_eq!(platform_root(cr, Platform::Twitch), Path::new("/foo/library/twitch"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue