101 lines
3.4 KiB
Rust
101 lines
3.4 KiB
Rust
use lumiere_domain::video::error::VideoError;
|
|
use lumiere_domain::video::model::library_item::{LibraryItem, LibraryRawItem};
|
|
use lumiere_domain::video::model::video::Video;
|
|
use lumiere_domain::video::port::VideoPort;
|
|
use uuid::Uuid;
|
|
use std::env;
|
|
use std::fs;
|
|
|
|
#[derive(Clone)]
|
|
pub struct VideoAdapter {
|
|
|
|
}
|
|
|
|
impl VideoAdapter {
|
|
pub fn new() -> Self {
|
|
Self {}
|
|
}
|
|
|
|
fn get_root_folder_read_library_items(&self) -> Result<Vec<LibraryRawItem>, VideoError> {
|
|
// Get the root_folder path from environment variable
|
|
let root_folder = env::var("ROOT_FOLDER").map_err(|_| VideoError::FolderBrowsingTechnicalIssue)?;
|
|
|
|
// List all elements inside this folder on the file system
|
|
let entries = fs::read_dir(root_folder)
|
|
.map_err(|e| VideoError::FolderBrowsingTechnicalIssue)?;
|
|
|
|
// Map all those elements into ReadLibraryItem objects
|
|
let mut items: Vec<LibraryRawItem> = Vec::new();
|
|
for entry in entries {
|
|
let entry = entry.map_err(|e| VideoError::FolderBrowsingTechnicalIssue)?;
|
|
let path = entry.path();
|
|
|
|
// Determine if it's a file or directory
|
|
let is_dir = path.is_dir();
|
|
let item_type = if is_dir {
|
|
lumiere_domain::video::model::library_item::LibraryItemType::FOLDER
|
|
} else {
|
|
lumiere_domain::video::model::library_item::LibraryItemType::VIDEO
|
|
};
|
|
|
|
// Create ReadLibraryItem with None for ID (will be generated later)
|
|
let item = LibraryRawItem {
|
|
id: None,
|
|
name: entry.file_name().to_string_lossy().into_owned(),
|
|
r#type: item_type,
|
|
};
|
|
|
|
items.push(item);
|
|
}
|
|
|
|
Ok(items)
|
|
}
|
|
|
|
fn get_all_library_items_from_db(&self) -> Result<Vec<LibraryRawItem>, VideoError> {
|
|
Ok(vec!())
|
|
}
|
|
|
|
fn merge_item_lists(file_system_items: Vec<LibraryRawItem>, db_items: Vec<LibraryRawItem>) -> Vec<LibraryRawItem> {
|
|
let file_system_items_which_are_not_in_database: Vec<LibraryRawItem> = file_system_items.into_iter()
|
|
.filter(|file_system_item| !Self::does_item_belong_to_db_items(&db_items, &file_system_item))
|
|
.collect();
|
|
|
|
db_items.into_iter().chain(file_system_items_which_are_not_in_database).collect()
|
|
}
|
|
|
|
fn does_item_belong_to_db_items(database_items: &Vec<LibraryRawItem>, file_system_item: &LibraryRawItem) -> bool {
|
|
database_items.iter()
|
|
.any(|database_item| database_item.id == file_system_item.id)
|
|
}
|
|
}
|
|
|
|
impl VideoPort for VideoAdapter {
|
|
fn list_root_folder(&self) -> Result<Vec<LibraryRawItem>, VideoError> {
|
|
let file_system_items = self.get_root_folder_read_library_items()?;
|
|
let db_items = self.get_all_library_items_from_db()?;
|
|
|
|
let merged = Self::merge_item_lists(file_system_items, db_items);
|
|
|
|
Ok(merged)
|
|
}
|
|
|
|
fn list_folder(&self, folder_id: Uuid) -> Result<Vec<LibraryRawItem>, VideoError> {
|
|
todo!()
|
|
}
|
|
|
|
fn get_video_stream(&self, video_id: Uuid) -> Result<Video, VideoError> {
|
|
todo!()
|
|
}
|
|
|
|
fn save(&self, library_item: &LibraryItem) -> Result<(), VideoError> {
|
|
todo!()
|
|
}
|
|
|
|
fn save_all(&self, library_items: &Vec<LibraryItem>) -> Result<(), VideoError> {
|
|
Ok(())
|
|
}
|
|
|
|
fn clone_box(&self) -> Box<dyn VideoPort> {
|
|
Box::new(self.clone())
|
|
}
|
|
} |