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:
Luna 2026-05-27 10:38:01 -07:00
parent 4cead6cf93
commit 4f15ab873f
4 changed files with 37 additions and 30 deletions

View file

@ -494,9 +494,10 @@ impl Downloader {
self.enqueue(cmd, url, label);
}
/// Path to the music download directory (sibling of `channels_root`).
/// Path to the music download directory, nested under `channels_root`
/// alongside the platform folders.
pub fn music_root(&self) -> PathBuf {
self.channels_root.with_file_name("music")
self.channels_root.join("music")
}
/// Download `url` as audio-only, storing tracks in `music/<artist>/`.