summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2018-11-06 23:26:02 -0500
committerJesse Luehrs <doy@tozt.net>2018-11-06 23:26:02 -0500
commit3f4a6ec11e55a1d5634ba24e2dfd32d9e1d70d65 (patch)
tree52c83d5495b734890ff0f6312273704311e45011 /src
parenta47cdb90b8bfb91bccb7ea7d36a54115d429605d (diff)
downloadlastfm-query-3f4a6ec11e55a1d5634ba24e2dfd32d9e1d70d65.tar.gz
lastfm-query-3f4a6ec11e55a1d5634ba24e2dfd32d9e1d70d65.zip
make db syncing work
Diffstat (limited to 'src')
-rw-r--r--src/db.rs20
-rw-r--r--src/exporter.rs36
-rw-r--r--src/lastfm/mod.rs4
-rw-r--r--src/main.rs14
4 files changed, 68 insertions, 6 deletions
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<F: FnMut(lastfm::Track)>(
+ &self,
+ tracks: impl Iterator<Item=lastfm::Track>,
+ 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<u64> {
+ let ts = self.db.most_recent_timestamp()?;
+ Ok(self.lastfm.track_count(ts.map(|x| x + 1))?)
+ }
+
+ pub fn sync<F: FnMut(lastfm::Track)>(&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");
}