1 #include "lib/spotify/playlist.hpp" 2 3 void lib::spt::to_json(nlohmann::json &j, const playlist &p) 4 { 5 j = nlohmann::json{ 6 {"collaborative", p.collaborative}, 7 {"description", p.description}, 8 {"id", p.id}, 9 {"image", p.image}, 10 {"name", p.name}, 11 {"is_public", p.is_public}, 12 {"total", p.tracks.size()}, 13 {"tracks", p.tracks}, 14 {"snapshot", p.snapshot}, 15 {"owner_id", p.owner_id}, 16 {"owner_name", p.owner_name} 17 }; 18 } 19 20 void lib::spt::from_json(const nlohmann::json &j, playlist &p) 21 { 22 if (!j.is_object()) 23 return; 24 25 j.at("collaborative").get_to(p.collaborative); 26 j.at("description").get_to(p.description); 27 j.at("id").get_to(p.id); 28 j.at("name").get_to(p.name); 29 lib::json::get_property(j, { 30 "is_public", "public" 31 }, p.is_public); 32 lib::json::get_property(j, { 33 "snapshot", "snapshot_id" 34 }, p.snapshot); 35 36 if (j.contains("tracks")) 37 { 38 auto tracks = j.at("tracks"); 39 if (tracks.is_array()) 40 tracks.get_to(p.tracks); 41 else if (tracks.is_object()) 42 { 43 tracks.at("href").get_to(p.tracks_href); 44 tracks.at("total").get_to(p.tracks_total); 45 } 46 } 47 48 if (j.contains("image")) 49 { 50 j.at("image").get_to(p.image); 51 } 52 else if (j.contains("images")) 53 { 54 const auto &images = j.at("images"); 55 if (!images.empty()) 56 { mount<P1: ?Sized + NixPath, P2: ?Sized + NixPath, P3: ?Sized + NixPath, P4: ?Sized + NixPath>( source: Option<&P1>, target: &P2, fstype: Option<&P3>, flags: MsFlags, data: Option<&P4>) -> Result<()>57 images.front().at("url").get_to(p.image); 58 } 59 } 60 61 if (j.contains("owner_id")) 62 { 63 j.at("owner_id").get_to(p.owner_id); 64 } 65 else if (j.contains("ownerId")) 66 { 67 j.at("ownerId").get_to(p.owner_id); 68 } 69 else 70 { 71 j.at("owner").at("id").get_to(p.owner_id); 72 } 73 74 if (j.contains("owner_name")) 75 { 76 j.at("owner_name").get_to(p.owner_name); 77 } 78 else if (j.contains("ownerName")) 79 { 80 j.at("ownerName").get_to(p.owner_name); 81 } 82 else 83 { umount<P: ?Sized + NixPath>(target: &P) -> Result<()>84 j.at("owner").at("display_name").get_to(p.owner_name); 85 } 86 } 87 88 auto lib::spt::playlist::is_owner(const lib::spt::user &user) const -> bool 89 { 90 return !owner_id.empty() && owner_id == user.id; 91 } umount2<P: ?Sized + NixPath>(target: &P, flags: MntFlags) -> Result<()>92 93 auto lib::spt::playlist::is_null() const -> bool 94 { 95 return id.empty(); 96 } 97 98 auto lib::spt::playlist::is_up_to_date(const std::string &playlist_snapshot) const -> bool 99 { 100 return owner_id != "spotify" 101 && snapshot == playlist_snapshot; 102 } 103