diff --git a/src/main.rs b/src/main.rs index 1c570bc..bff51a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::path::PathBuf; use google_api_auth; use google_photoslibrary1; +use google_photoslibrary1::schemas::SearchMediaItemsRequest; use regex::Regex; use structopt::StructOpt; use yup_oauth2::{Authenticator, InstalledFlow}; @@ -10,7 +11,12 @@ use yup_oauth2::{Authenticator, InstalledFlow}; #[derive(Debug, StructOpt)] enum Command { /// List albums for the user of the given credentials. Optionally title filter. - ListAlbums { title_filter: Option }, + ListAlbums { + title_filter: Option, + }, + SearchMediaItems { + album_id: String, + }, } #[derive(Debug, StructOpt)] @@ -59,6 +65,40 @@ fn new_client( Ok(google_photoslibrary1::Client::new(auth)) } +fn search_media_items( + client: google_photoslibrary1::Client, + album_id: String, +) -> Result<(), Box> { + let mut page_token = None; + let mut total = 0; + loop { + let resp = client + .media_items() + .search(SearchMediaItemsRequest { + album_id: Some(album_id.clone()), + page_token, + ..Default::default() + }) + .execute_with_all_fields()?; + + let media_items = resp.media_items.ok_or("no results")?; + println!("got ({}) items", media_items.len()); + total += media_items.len(); + for mi in media_items { + println!( + "{} {}", + mi.id.unwrap_or("NO ID".to_string()), + mi.filename.unwrap_or("NO FILENAME".to_string()) + ); + } + page_token = resp.next_page_token; + if page_token.is_none() { + println!("({}) items total", total); + return Ok(()); + } + } +} + fn list_albums( client: google_photoslibrary1::Client, title_filter: Option, @@ -80,9 +120,10 @@ fn list_albums( } } println!( - "album: {} {}", + "album: {} {} ({} items)", a.id.unwrap_or("NO ID".to_string()), - a.title.unwrap_or("NO TITLE".to_string()).to_string() + a.title.unwrap_or("NO TITLE".to_string()).to_string(), + a.media_items_count.unwrap_or(0) ); } Ok(()) @@ -94,5 +135,6 @@ fn main() -> Result<(), Box> { let client = new_client(&opt.credentials, &opt.token_cache)?; match opt.cmd { Command::ListAlbums { title_filter } => list_albums(client, title_filter), + Command::SearchMediaItems { album_id } => search_media_items(client, album_id), } }