use std::{fs, path::Path};
use crate::models::{Comments, MovieState, ShowBookmarks};
const SHOW_BOOKMARKS_FILE: &str = "show.bookmarks.toml";
fn movie_state_path(video_path: &Path) -> std::path::PathBuf {
let stem = video_path.file_stem().unwrap_or_default().to_string_lossy();
let dir = video_path.parent().unwrap_or(Path::new("."));
dir.join(format!("{stem}.watched.toml"))
}
pub fn load_movie_state(video_path: &Path) -> Option<MovieState> {
let path = movie_state_path(video_path);
let raw = fs::read_to_string(&path).ok()?;
match toml::from_str(&raw) {
Ok(s) => Some(s),
Err(e) => {
eprintln!("Failed to parse {:?}: {}", path, e);
None
}
}
}
pub fn save_movie_state(video_path: &Path, state: &MovieState) -> std::io::Result<()> {
let path = movie_state_path(video_path);
let raw = toml::to_string_pretty(state).map_err(std::io::Error::other)?;
let content = format!(
"# MediaVault — movie watch state\n\
# You can edit this file manually. It will be re-read on next launch.\n\n\
{raw}"
);
fs::write(path, content)
}
pub fn load_show_bookmarks(base_dir: &Path) -> Option<ShowBookmarks> {
let path = base_dir.join(SHOW_BOOKMARKS_FILE);
let raw = fs::read_to_string(&path).ok()?;
match toml::from_str(&raw) {
Ok(b) => Some(b),
Err(e) => {
eprintln!("Failed to parse {:?}: {}", path, e);
None
}
}
}
pub fn save_show_bookmarks(base_dir: &Path, bookmarks: &ShowBookmarks) -> std::io::Result<()> {
let path = base_dir.join(SHOW_BOOKMARKS_FILE);
let raw = toml::to_string_pretty(bookmarks).map_err(std::io::Error::other)?;
let content = format!(
"# MediaVault — show bookmark state\n\
# watched_episodes lists relative paths of every fully-watched episode.\n\
# next_up is the episode that will open when you press Continue.\n\
# You can edit both fields manually.\n\n\
{raw}"
);
fs::write(path, content)
}
pub fn load_comments_from_path(path: &Path) -> Comments {
let raw = match fs::read_to_string(path) {
Ok(r) => r,
Err(_) => return Comments::default(),
};
Comments { markdown: raw }
}
pub fn save_comments_to_path(path: &Path, comments: &Comments) -> std::io::Result<()> {
if let Some(parent) = path.parent() {
fs::create_dir_all(parent)?;
}
fs::write(path, &comments.markdown)
}