featadded database operations
This commit is contained in:
parent
b6a41c8fb2
commit
4e36010d13
4 changed files with 116 additions and 46 deletions
|
@ -14,3 +14,5 @@ serde = { version = "1.0.143", features = ["derive"] }
|
||||||
serde_json = "1.0.83"
|
serde_json = "1.0.83"
|
||||||
rusqlite = {version="0.28.0", features=["bundled"]}
|
rusqlite = {version="0.28.0", features=["bundled"]}
|
||||||
scan_dir = "0.3.3"
|
scan_dir = "0.3.3"
|
||||||
|
derive_more = "0.99.17"
|
||||||
|
id3 = "1.5.1"
|
||||||
|
|
63
src/db_operations.rs
Normal file
63
src/db_operations.rs
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
use derive_more::From;
|
||||||
|
use rusqlite::{params, Connection, Params, Result};
|
||||||
|
|
||||||
|
use crate::file_operations::ItemTag;
|
||||||
|
|
||||||
|
#[derive(From, Debug)]
|
||||||
|
pub enum DatabaseCreationError {
|
||||||
|
RusqliteError(rusqlite::Error),
|
||||||
|
IoError(std::io::Error),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct DBObject {
|
||||||
|
pub conn: Connection,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DBObject {
|
||||||
|
pub fn new(
|
||||||
|
db_filepath: &std::path::PathBuf,
|
||||||
|
in_memory: bool,
|
||||||
|
) -> Result<Self, DatabaseCreationError> {
|
||||||
|
let conn: Connection;
|
||||||
|
|
||||||
|
std::fs::create_dir_all(db_filepath.parent().unwrap())?;
|
||||||
|
|
||||||
|
if in_memory {
|
||||||
|
conn = Connection::open_in_memory()?;
|
||||||
|
} else {
|
||||||
|
conn = Connection::open(db_filepath)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CREATE TABLE IF NOT EXISTS comment (
|
||||||
|
// id INTEGER PRIMARY KEY,
|
||||||
|
// email TEXT,
|
||||||
|
// author TEXT,
|
||||||
|
// text TEXT NOT NULL,
|
||||||
|
// timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
// content_id TEXT NOT NULL,
|
||||||
|
// parent INTEGER
|
||||||
|
// )
|
||||||
|
|
||||||
|
conn.execute(
|
||||||
|
"CREATE TABLE IF NOT EXISTS musicinfo (
|
||||||
|
path TEXT PRIMARY KEY,
|
||||||
|
title TEXT NOT NULL,
|
||||||
|
artist TEXT,
|
||||||
|
album TEXT,
|
||||||
|
album_artist TEXT
|
||||||
|
|
||||||
|
)",
|
||||||
|
params![],
|
||||||
|
)?;
|
||||||
|
|
||||||
|
Ok(DBObject { conn })
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn save_tag(self: &Self, tag: &ItemTag) -> Result<(), DatabaseCreationError> {
|
||||||
|
self.conn.execute(
|
||||||
|
"INSERT INTO musicinfo (path, title, artist, album, album_artist) VALUES ( ?1, ?2, ?3, ?4, ?5 )",
|
||||||
|
params![tag.path, tag.title, tag.artist, tag.album, tag.album_artist],
|
||||||
|
)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
|
use id3::{Tag, TagLike};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use scan_dir::ScanDir;
|
use scan_dir::ScanDir;
|
||||||
|
@ -73,49 +74,45 @@ impl Iterator for MusicScanner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Recursivly scans the given root directory for files
|
pub struct ItemTag {
|
||||||
/// WIP Function! All it does is print the directories
|
pub path: String,
|
||||||
///
|
pub title: String,
|
||||||
/// # Examples
|
pub artist: String,
|
||||||
///
|
pub album: String,
|
||||||
/// ```rust
|
pub album_artist: String,
|
||||||
/// scan_music_dir("/home/Documents/RustedBeats");
|
}
|
||||||
///
|
|
||||||
///>>> "I found a directory src at .../src"
|
|
||||||
///>>> "I found a directory debug at .../debug"
|
|
||||||
///>>> "I found a file Cargo.toml at .../Cargo.toml"
|
|
||||||
///...
|
|
||||||
/// ```
|
|
||||||
///
|
|
||||||
pub fn scan_music_dir(root: String) -> Result<(), ()> {
|
|
||||||
let mut directories = Vec::<PathBuf>::new();
|
|
||||||
directories.push(root.into());
|
|
||||||
|
|
||||||
while directories.len() != 0 {
|
impl ItemTag {
|
||||||
let target = match directories.pop() {
|
pub fn new() -> Self {
|
||||||
Some(val) => val,
|
ItemTag {
|
||||||
None => {
|
path: String::new(),
|
||||||
panic!("Whoa man this ai't right");
|
title: String::new(),
|
||||||
}
|
artist: String::new(),
|
||||||
};
|
album: String::new(),
|
||||||
|
album_artist: String::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ScanDir::dirs()
|
pub fn get_tag(filepath: &PathBuf) -> Result<ItemTag, id3::Error> {
|
||||||
.read(target.clone(), |iter| {
|
let tag = Tag::read_from_path(filepath)?;
|
||||||
for (entry, name) in iter {
|
|
||||||
directories.push(entry.path());
|
|
||||||
println!("I found a director {:?} at path {:?}", name, entry.path());
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
ScanDir::files()
|
let mut output_tag = ItemTag::new();
|
||||||
.read(target, |iter| {
|
output_tag.path = filepath.to_string_lossy().into_owned();
|
||||||
for (entry, name) in iter {
|
|
||||||
println!("found file {:?} at path {:?}", name, entry.path());
|
// Get a bunch of frames...
|
||||||
}
|
if let Some(artist) = tag.artist() {
|
||||||
})
|
output_tag.artist = artist.to_string();
|
||||||
.unwrap();
|
println!("artist: {}", artist);
|
||||||
|
}
|
||||||
|
if let Some(title) = tag.title() {
|
||||||
|
output_tag.title = title.to_string();
|
||||||
|
println!("title: {}", title);
|
||||||
|
}
|
||||||
|
if let Some(album) = tag.album() {
|
||||||
|
output_tag.album = album.to_string();
|
||||||
|
println!("album: {}", album);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(output_tag)
|
||||||
}
|
}
|
||||||
|
|
20
src/main.rs
20
src/main.rs
|
@ -1,6 +1,9 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use dirs_next;
|
use dirs_next;
|
||||||
|
|
||||||
|
pub mod db_operations;
|
||||||
pub mod file_operations;
|
pub mod file_operations;
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
|
@ -38,20 +41,25 @@ fn main() {
|
||||||
let music_dir: String;
|
let music_dir: String;
|
||||||
if cli.root_directory.is_some() {
|
if cli.root_directory.is_some() {
|
||||||
music_dir = cli.root_directory.clone().unwrap();
|
music_dir = cli.root_directory.clone().unwrap();
|
||||||
println!(
|
|
||||||
"Music directory is: {}",
|
|
||||||
cli.root_directory.clone().unwrap()
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
music_dir = String::from(dirs_next::audio_dir().unwrap().to_str().unwrap());
|
music_dir = String::from(dirs_next::audio_dir().unwrap().to_str().unwrap());
|
||||||
println!("Music directory is: {:?}", dirs_next::audio_dir());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let music_scanner = file_operations::MusicScanner::new(music_dir);
|
let music_scanner = file_operations::MusicScanner::new(music_dir);
|
||||||
|
|
||||||
|
let mut db_path = PathBuf::new();
|
||||||
|
db_path.push("/home/nixolas/RustedBeats.db");
|
||||||
|
|
||||||
|
let dbo = db_operations::DBObject::new(&db_path, false).unwrap();
|
||||||
|
|
||||||
for file_batch in music_scanner {
|
for file_batch in music_scanner {
|
||||||
for filepath in file_batch {
|
for filepath in file_batch {
|
||||||
println!("{:?}", filepath);
|
if filepath.to_string_lossy().ends_with(".wav") {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
let tag = file_operations::get_tag(&filepath).unwrap();
|
||||||
|
dbo.save_tag(&tag).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue