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