Add watched tracking, resume positions, sort, density slider, channel metadata, mpv IPC, browser selector, auto-rescan

- SQLite DB for watched/position persistence (database.rs)
- Mark watched toggle on cards and detail panel
- mpv IPC socket integration for resume position tracking (unix)
- Sort by title, duration, file size
- Thumbnail density slider in top bar
- Channel metadata banner (subscriber count, uploader, channel URL)
- Cookie browser selector dropdown in settings
- Auto-rescan library when a download job finishes
- Fix yt-dlp --no-progress-bar flag (does not exist; removed)
- Browser field wired through config → downloader

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Luna 2026-05-11 03:47:29 -07:00
parent 95a73b0980
commit 5b3b8fc901
7 changed files with 644 additions and 221 deletions

View file

@ -15,10 +15,18 @@ pub struct BackupSection {
pub directory: PathBuf,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PlayerSection {
#[serde(default = "default_player")]
pub command: String,
#[serde(default = "default_browser")]
pub browser: String,
}
impl Default for PlayerSection {
fn default() -> Self {
Self { command: default_player(), browser: default_browser() }
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
@ -33,13 +41,9 @@ impl Default for UiSection {
}
}
fn default_player() -> String {
"mpv".to_string()
}
fn default_theme() -> String {
"dark".to_string()
}
fn default_player() -> String { "mpv".to_string() }
fn default_browser() -> String { "firefox".to_string() }
fn default_theme() -> String { "dark".to_string() }
impl Config {
pub fn load(path: &Path) -> Result<Self, Box<dyn std::error::Error>> {