1use chrono::prelude::*;
4use chrono::Duration;
5use serde::{Deserialize, Serialize};
6
7use std::collections::HashMap;
8
9use crate::{
10 custom_serde::duration_ms, PlayableId, Restriction, SimplifiedAlbum, SimplifiedArtist, TrackId,
11 Type,
12};
13
14#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
16pub struct FullTrack {
17 pub album: SimplifiedAlbum,
18 pub artists: Vec<SimplifiedArtist>,
19 #[serde(skip_serializing_if = "Vec::is_empty", default)]
20 pub available_markets: Vec<String>,
21 pub disc_number: i32,
22 #[serde(with = "duration_ms", rename = "duration_ms")]
23 pub duration: Duration,
24 pub explicit: bool,
25 pub external_ids: HashMap<String, String>,
26 pub external_urls: HashMap<String, String>,
27 pub href: Option<String>,
28 pub id: Option<TrackId<'static>>,
30 pub is_local: bool,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub is_playable: Option<bool>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub linked_from: Option<TrackLink>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub restrictions: Option<Restriction>,
37 pub name: String,
38 pub popularity: u32,
39 pub preview_url: Option<String>,
40 pub track_number: u32,
41}
42
43#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
46pub struct TrackLink {
47 pub external_urls: HashMap<String, String>,
48 pub href: String,
49 pub id: Option<TrackId<'static>>,
50 pub r#type: Type,
51 pub uri: String,
52}
53
54#[derive(Deserialize)]
56pub struct FullTracks {
57 pub tracks: Vec<FullTrack>,
58}
59
60#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
65pub struct SimplifiedTrack {
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub album: Option<SimplifiedAlbum>,
68 pub artists: Vec<SimplifiedArtist>,
69 pub available_markets: Option<Vec<String>>,
70 pub disc_number: i32,
71 #[serde(with = "duration_ms", rename = "duration_ms")]
72 pub duration: Duration,
73 pub explicit: bool,
74 pub external_urls: HashMap<String, String>,
75 #[serde(default)]
76 pub href: Option<String>,
77 pub id: Option<TrackId<'static>>,
78 pub is_local: bool,
79 pub is_playable: Option<bool>,
80 pub linked_from: Option<TrackLink>,
81 pub restrictions: Option<Restriction>,
82 pub name: String,
83 pub preview_url: Option<String>,
84 pub track_number: u32,
85}
86
87#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
89pub struct SavedTrack {
90 pub added_at: DateTime<Utc>,
91 pub track: FullTrack,
92}
93
94pub struct ItemPositions<'a> {
100 pub id: PlayableId<'a>,
101 pub positions: &'a [u32],
102}