From 3f4a6ec11e55a1d5634ba24e2dfd32d9e1d70d65 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 6 Nov 2018 23:26:02 -0500 Subject: make db syncing work --- src/db.rs | 20 ++++++++++++++++++++ src/exporter.rs | 36 ++++++++++++++++++++++++++++++++++++ src/lastfm/mod.rs | 4 ++-- src/main.rs | 14 ++++++++++---- 4 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 src/exporter.rs (limited to 'src') diff --git a/src/db.rs b/src/db.rs index 450202f..b291e86 100644 --- a/src/db.rs +++ b/src/db.rs @@ -1,4 +1,5 @@ use error::Result; +use lastfm; const SCHEMA: &'static str = " CREATE TABLE `tracks` ( @@ -56,4 +57,23 @@ impl DB { } })?) } + + pub fn insert_tracks( + &self, + tracks: impl Iterator, + mut f: F + ) -> Result<()> { + let mut sth = self.conn.prepare("INSERT INTO tracks VALUES (?, ?, ?, ?)")?; + for track in tracks { + sth.execute( + &[ + &track.artist as &rusqlite::types::ToSql, + &track.album, + &track.name, + &track.timestamp, + ]).map(|_| ())?; + f(track); + } + Ok(()) + } } diff --git a/src/exporter.rs b/src/exporter.rs new file mode 100644 index 0000000..89ad32c --- /dev/null +++ b/src/exporter.rs @@ -0,0 +1,36 @@ +use db; +use lastfm; + +use error::Result; + +pub struct Exporter<'d, 'l> { + db: &'d db::DB, + lastfm: &'l lastfm::LastFMClient, +} + +impl<'d, 'l> Exporter<'d, 'l> { + pub fn new( + db: &'d db::DB, + lastfm: &'l lastfm::LastFMClient + ) -> Exporter<'d, 'l> { + Exporter { + db, + lastfm, + } + } + + pub fn tracks_to_sync(&self) -> Result { + let ts = self.db.most_recent_timestamp()?; + Ok(self.lastfm.track_count(ts.map(|x| x + 1))?) + } + + pub fn sync(&self, track_cb: F) -> Result<()> { + let ts = self.db.most_recent_timestamp()?; + self.db.insert_tracks( + self.lastfm.tracks(ts.map(|x| x + 1)), + track_cb + )?; + + Ok(()) + } +} diff --git a/src/lastfm/mod.rs b/src/lastfm/mod.rs index ea23ee5..a4ec8eb 100644 --- a/src/lastfm/mod.rs +++ b/src/lastfm/mod.rs @@ -15,8 +15,8 @@ pub struct LastFMClient { pub struct Track { pub artist: String, - pub name: String, pub album: String, + pub name: String, pub timestamp: i64, } @@ -66,8 +66,8 @@ impl<'a> Tracks<'a> { .map(|t| { Ok(Track { artist: t.artist.text.clone(), - name: t.name.clone(), album: t.album.text.clone(), + name: t.name.clone(), timestamp: t.date.uts.parse()?, }) }) diff --git a/src/main.rs b/src/main.rs index 0df7810..ac8e5f8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ extern crate directories; extern crate failure; +extern crate pbr; extern crate reqwest; extern crate rusqlite; extern crate serde; @@ -8,6 +9,7 @@ extern crate serde_json; extern crate serde_derive; mod error; +mod exporter; mod lastfm; mod paths; mod db; @@ -23,10 +25,14 @@ fn main() { let db = db::DB::new(&paths::dbpath()) .expect("failed to create db"); let lastfm = lastfm::LastFMClient::new(api_key, username); + let exporter = exporter::Exporter::new(&db, &lastfm); - println!("{}", lastfm.track_count().unwrap()); + let to_fetch = exporter.tracks_to_sync().unwrap(); + println!("need to download {} tracks", to_fetch); + let mut bar = pbr::ProgressBar::new(to_fetch); - for track in lastfm.tracks().take(10) { - println!("{}", track.name); - } + exporter.sync(|_| { bar.inc(); }) + .expect("failed to update db"); + + bar.finish_print("done"); } -- cgit v1.2.3-54-g00ecf