A tool to sync music with your favorite devices
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

*: cargo fix

Gee Sawra abf3a5e8 bca36412

+3 -110
+2 -2
src/cmd/filter.rs
··· 1 - use crate::{cmd::error, db, filter}; 2 - use anyhow::{Context, Result, anyhow}; 1 + use crate::{db, filter}; 2 + use anyhow::{Context, Result}; 3 3 use clap::Args as ClapArgs; 4 4 5 5 const DEFAULT_FILTER: &'static str = include_str!("default_filter.rhai");
-16
src/db/instance.rs
··· 273 273 Ok(()) 274 274 } 275 275 276 - pub async fn track_ids_by_state(&self, state: model::FileState) -> Result<Vec<String>, Error> { 277 - let mut conn = self.pool.acquire().await?; 278 - 279 - Ok(sqlx::query!( 280 - r#" 281 - SELECT track_id FROM tracks WHERE file_state = ?1; 282 - "#, 283 - state, 284 - ) 285 - .fetch_all(&mut *conn) 286 - .await? 287 - .into_iter() 288 - .map(|t| t.track_id) 289 - .collect::<Vec<String>>()) 290 - } 291 - 292 276 pub async fn tracks_by_id(&self, ids: Vec<String>) -> Result<Vec<model::Track>, Error> { 293 277 let mut conn = self.pool.acquire().await?; 294 278
-26
src/db/lib.rs
··· 7 7 8 8 use crate::model; 9 9 10 - use super::instance::Instance; 11 - 12 10 pub(crate) async fn is_initialized(pool: &SqlitePool) -> Result<bool, Error> { 13 11 let mut conn = pool.acquire().await?; 14 12 ··· 35 33 .await?; 36 34 37 35 Ok(res.is_external.unwrap_or_default()) 38 - } 39 - 40 - pub async fn diff(source: &Instance, destination: &Instance) -> Result<Vec<String>, Error> { 41 - let source_ids = source 42 - .track_ids_by_state(crate::model::FileState::Copied) 43 - .await?; 44 - log::debug!("source ids: {}", source_ids.len(),); 45 - 46 - let source_ids: hash_set::HashSet<String> = source_ids.into_iter().collect(); 47 - let dest_ids: hash_set::HashSet<String> = destination 48 - .track_ids_by_state(crate::model::FileState::Copied) 49 - .await? 50 - .into_iter() 51 - .collect(); 52 - 53 - log::debug!( 54 - "source ids: {} dest ids: {}", 55 - source_ids.len(), 56 - dest_ids.len() 57 - ); 58 - 59 - let d: hash_set::HashSet<&String> = source_ids.difference(&dest_ids).collect(); 60 - 61 - Ok(d.into_iter().map(|e| e.clone()).collect()) 62 36 } 63 37 64 38 pub async fn diff_vec(
-1
src/db/mod.rs
··· 3 3 4 4 pub use instance::Instance; 5 5 pub use lib::default_database_dir; 6 - pub use lib::diff; 7 6 pub use lib::diff_vec;
-5
src/device/lib.rs
··· 2 2 use anyhow::Result; 3 3 use async_trait::async_trait; 4 4 5 - pub enum DeviceType { 6 - IPod, 7 - Disk, 8 - } 9 - 10 5 #[async_trait] 11 6 pub trait Device { 12 7 async fn set_transcoding_settings(&self, settings: Option<ffmpeg::Quality>) -> Result<()>;
+1 -1
src/device/mod.rs
··· 2 2 mod ipod; 3 3 mod lib; 4 4 5 - pub use crate::device::lib::{Device, DeviceType}; 5 + pub use crate::device::lib::Device; 6 6 pub use crate::device::{disk::Disk, ipod::IPod};
-59
src/sync.rs
··· 1 - use crate::db; 2 1 use crate::device; 3 2 use crate::model; 4 3 use anyhow::{Ok, Result}; 5 4 use async_std::sync::Mutex; 6 5 use futures::{StreamExt, TryStreamExt, stream}; 7 - use std::collections::hash_map; 8 - use std::collections::hash_set; 9 6 use std::sync::Arc; 10 - 11 - pub async fn diff_databases( 12 - source: &db::Instance, 13 - destination: &db::Instance, 14 - filters: Option<&Vec<crate::filter::ScriptRuntime>>, 15 - delete: bool, 16 - ) -> Result<Vec<String>> { 17 - let local_tracks = source.tracks_by_state(model::FileState::Copied).await?; 18 - 19 - let local_tracks = filter_tracks(local_tracks, filters, delete)?; 20 - 21 - let dest_tracks = destination 22 - .tracks_by_state(model::FileState::Copied) 23 - .await?; 24 - 25 - let src_ids: hash_set::HashSet<String> = local_tracks 26 - .clone() 27 - .into_iter() 28 - .map(|t| t.track_id) 29 - .collect(); 30 - 31 - let dst_ids: hash_set::HashSet<String> = dest_tracks 32 - .clone() 33 - .into_iter() 34 - .map(|t| t.track_id) 35 - .collect(); 36 - 37 - log::debug!("local {} dest {}", src_ids.len(), dst_ids.len()); 38 - 39 - let d: hash_set::HashSet<&String> = dst_ids.difference(&src_ids).collect(); 40 - 41 - Ok(d.into_iter().map(|e| e.clone()).collect()) 42 - } 43 - 44 - pub async fn diff_vec( 45 - source: Vec<model::Track>, 46 - destination: Vec<model::Track>, 47 - ) -> Result<Vec<model::Track>> { 48 - let source: hash_map::HashMap<String, model::Track> = source 49 - .iter() 50 - .map(|t| (t.track_id.clone(), t.clone())) 51 - .collect(); 52 - let source_ids: hash_set::HashSet<String> = source.clone().into_iter().map(|t| t.0).collect(); 53 - 54 - let destination: hash_map::HashMap<String, model::Track> = destination 55 - .iter() 56 - .map(|t| (t.track_id.clone(), t.clone())) 57 - .collect(); 58 - let dest_ids: hash_set::HashSet<String> = destination.into_iter().map(|t| t.0).collect(); 59 - 60 - let d: hash_set::HashSet<&String> = source_ids.difference(&dest_ids).collect(); 61 - 62 - Ok(d.into_iter() 63 - .map(|e| source.get(e).unwrap().clone()) 64 - .collect()) 65 - } 66 7 67 8 pub fn filter_tracks( 68 9 raw_tracks: Vec<model::Track>,