Start to implement the VideoService list_root_folder method.

This commit is contained in:
Florian THIERRY
2026-07-14 14:27:45 +02:00
parent f8fd59b01a
commit 2df12118eb
11 changed files with 69 additions and 15 deletions
+1
View File
@@ -3,5 +3,6 @@
backend/launcher/lumiere.sqlite backend/launcher/lumiere.sqlite
backend/launcher/.env backend/launcher/.env
backend/launcher/certs backend/launcher/certs
backend/root_folder
frontend/.angular frontend/.angular
frontend/node_modules frontend/node_modules
+31
View File
@@ -4,6 +4,37 @@ use std::fs::File;
use std::io::{BufRead, BufReader}; use std::io::{BufRead, BufReader};
use std::path::Path; use std::path::Path;
use std::io::Read; use std::io::Read;
use lumiere_domain::video::error::VideoError;
use lumiere_domain::video::model::library_item::LibraryItem;
use lumiere_domain::video::port::VideoPort;
#[derive(Clone)]
pub struct VideoService {
video_port: Box<dyn VideoPort>
}
impl VideoService {
pub fn new(video_port: Box<dyn VideoPort>) -> Self {
Self { video_port }
}
pub fn list_root_folder(self) -> Result<Vec<LibraryItem>, VideoError> {
let library_items = self.video_port.list_root_folder()?;
let items_without_id = library_items.iter().filter(|item| item.id == None);
// generate a new Uuid for each item without id
// assign this new Uuid to the item
// save the item by using the method video_port.save
// replace the items_without_id by modified items_without_id
Ok(vec!())
}
}
/// Basic example: Read file line by line using BufReader /// Basic example: Read file line by line using BufReader
pub fn read_file_line_by_line(path: &str) -> std::io::Result<()> { pub fn read_file_line_by_line(path: &str) -> std::io::Result<()> {
+6
View File
@@ -0,0 +1,6 @@
use uuid::Uuid;
pub struct FolderItem {
pub id: Option<Uuid>,
pub name: String,
}
@@ -0,0 +1,18 @@
use uuid::Uuid;
pub enum LibraryItemType {
VIDEO,
FOLDER
}
pub struct LibraryItem {
pub id: Uuid,
pub name: String,
pub r#type: LibraryItemType,
}
pub struct ReadLibraryItem {
pub id: Option<Uuid>,
pub name: String,
pub r#type: LibraryItemType,
}
+3
View File
@@ -0,0 +1,3 @@
pub mod folder;
pub mod library_item;
pub mod video;
@@ -12,7 +12,7 @@ pub trait VideoFile {}
pub struct Video { pub struct Video {
pub id: Uuid, pub id: Uuid,
pub filename: String, pub name: String,
pub file: Box<dyn VideoFile>, pub file: Box<dyn VideoFile>,
pub format: VideoFormat, pub format: VideoFormat,
} }
+5 -3
View File
@@ -1,11 +1,13 @@
use uuid::Uuid; use uuid::Uuid;
use crate::video::error::VideoError; use crate::video::error::VideoError;
use crate::video::model::Video; use crate::video::model::library_item::{LibraryItem, ReadLibraryItem};
use crate::video::model::video::Video;
pub trait VideoPort: Send + Sync { pub trait VideoPort: Send + Sync {
fn list_root(&self) -> Result<Vec<Video>, VideoError>; fn list_root_folder(&self) -> Result<Vec<ReadLibraryItem>, VideoError>;
fn list_folder(&self, folder_id: Uuid) -> Result<Vec<Video>, VideoError>; fn list_folder(&self, folder_id: Uuid) -> Result<Vec<ReadLibraryItem>, VideoError>;
fn get_video_stream(&self, video_id: Uuid) -> Result<Video, VideoError>; fn get_video_stream(&self, video_id: Uuid) -> Result<Video, VideoError>;
fn save(&self, library_item: LibraryItem) -> Result<(), VideoError>;
fn clone_box(&self) -> Box<dyn VideoPort>; fn clone_box(&self) -> Box<dyn VideoPort>;
} }
-2
View File
@@ -1,9 +1,7 @@
extern crate core; extern crate core;
use crate::user::validator::validator;
use actix_web::web::ServiceConfig; use actix_web::web::ServiceConfig;
use actix_web::{get, web, HttpResponse, Responder}; use actix_web::{get, web, HttpResponse, Responder};
use actix_web_httpauth::middleware::HttpAuthentication;
use crate::video::handler::download_file; use crate::video::handler::download_file;
pub mod user; pub mod user;
@@ -1,4 +1,4 @@
use lumiere_domain::video::model::VideoFormat; use lumiere_domain::video::library_item::VideoFormat;
pub fn map_to_content_type(video_format: &VideoFormat) -> &'static str { pub fn map_to_content_type(video_format: &VideoFormat) -> &'static str {
match video_format { match video_format {
@@ -1,7 +1,7 @@
use std::fs::File; use std::fs::File;
use std::path::Path; use std::path::Path;
use lumiere_domain::video::model::VideoFormat; use lumiere_domain::video::library_item::VideoFormat;
use lumiere_domain::video::model::VideoFormat::{AVI, MKV, MP4, UNKNOWN, WEBM}; use lumiere_domain::video::library_item::VideoFormat::{AVI, MKV, MP4, UNKNOWN, WEBM};
/// Determine Content-Type by reading file headers (magic numbers) /// Determine Content-Type by reading file headers (magic numbers)
pub fn get_content_type(path: &Path) -> VideoFormat { pub fn get_content_type(path: &Path) -> VideoFormat {
+1 -6
View File
@@ -1,9 +1,4 @@
HTTPS_ENABLED=false
JWT_SECRET=jwt-secret JWT_SECRET=jwt-secret
SQLITE_DATABASE_NAME=lumiere.sqlite SQLITE_DATABASE_NAME=lumiere.sqlite
BCRYPT_SALT=salt BCRYPT_SALT=salt
SNAPSHOT_RESOURCES_CRON_FREQUENCY="*/5 * * * * *" ROOT_FOLDER=<replace-this-path>
SERVER_MODE=real # real | mocked
#MOCKED_DAEMON_START_SUCCESS=true
#MOCKED_DAEMON_STOP_SUCCESS=true
#MOCKED_DAEMON_RESTART_SUCCESS=true