/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2023 metamuffin */ use crate::{database::Database, CONF}; use anyhow::{bail, Context, Ok}; use jellycommon::Node; use log::info; use std::{ffi::OsStr, fs::File, os::unix::prelude::OsStrExt, path::PathBuf}; pub fn import(db: &Database) -> anyhow::Result<()> { info!("clearing node tree"); db.node.clear()?; info!("importing..."); import_path(CONF.library_path.clone(), db, None).context("indexing")?; Ok(()) } pub fn import_path( path: PathBuf, db: &Database, parent: Option, ) -> anyhow::Result> { if path.is_dir() { let mpath = path.join("directory.json"); let children = path.read_dir()?.filter_map(|e| { let e = e.unwrap(); if e.path().extension() == Some(&OsStr::from_bytes(b"jelly")) || e.metadata().unwrap().is_dir() { Some(e.path()) } else { None } }); let identifier = path.file_name().unwrap().to_str().unwrap().to_string(); let children = children .map(|e| import_path(e, db, Some(identifier.clone()))) .collect::>>()? .into_iter() .flatten() .collect(); if mpath.exists() { let mut data: Node = serde_json::from_reader(File::open(mpath).context("metadata missing")?)?; data.public.children = children; data.public.parent = parent; info!("insert {identifier}"); db.node.insert(&identifier, &data)?; Ok(vec![identifier]) } else { Ok(children) } } else if path.is_file() { info!("loading item {path:?}"); let datafile = File::open(path.clone()).context("cant load metadata")?; let mut data: Node = serde_json::from_reader(datafile).context("invalid metadata")?; let identifier = path .file_name() .unwrap() .to_str() .unwrap() .strip_suffix(".jelly") .unwrap() .to_string(); info!("insert {identifier}"); data.public.parent = parent; db.node.insert(&identifier, &data)?; Ok(vec![identifier]) } else { bail!("did somebody really put a fifo or socket in the library?!") } }