annotate src/beefweb.rs @ 1:a5ee18c79a04

license
author Paper <paper@tflc.us>
date Sat, 04 Apr 2026 12:34:46 -0400
parents d60ab8a4442f
children 594c0f9d7972
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
1
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
2 * Beefweb <-> mpris "compatibility" layer.
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
3 *
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
4 * Copyright (C) 2026 Paper
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
5 *
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
7 * modify it under the terms of the GNU General Public License
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
8 * as published by the Free Software Foundation; either version 2
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
9 * of the License, or (at your option) any later version.
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
10 *
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
14 * GNU General Public License for more details.
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
15 *
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
17 * along with this program; if not, see
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
18 * <https://www.gnu.org/licenses/>.
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
19 */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
20
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
21 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
22 pub struct PlayerInfo {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
23 pub name: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
24 pub title: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
25 pub version: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
26 // fuck camel case
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
27 #[serde(rename = "pluginVersion")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
28 pub plugin_version: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
29 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
30
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
31 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
32 pub struct ActiveItemInfo {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
33 #[serde(rename = "playlistId")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
34 pub playlist_id: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
35 #[serde(rename = "playlistIndex")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
36 pub playlist_index: i64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
37 pub index: i64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
38 pub position: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
39 pub duration: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
40 pub columns: Vec<String>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
41 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
42
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
43 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
44 pub enum VolumeType {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
45 #[serde(rename = "db")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
46 DB,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
47 #[serde(rename = "linear")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
48 LINEAR,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
49 #[serde(rename = "upDown")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
50 UPDOWN, /* ??? */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
51 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
52
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
53 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
54 pub struct VolumeInfo {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
55 pub r#type: VolumeType,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
56 pub min: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
57 pub max: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
58 pub value: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
59 #[serde(rename = "isMuted")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
60 pub muted: bool,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
61 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
62
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
63 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
64 pub struct ApiPermissions {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
65 #[serde(rename = "changePlaylists")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
66 pub change_playlists: bool,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
67 #[serde(rename = "changeOutput")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
68 pub change_output: bool,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
69 #[serde(rename = "changeClientConfig")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
70 pub change_client_config: bool,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
71 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
72
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
73 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
74 pub struct Player {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
75 pub info: PlayerInfo,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
76 #[serde(rename = "activeItem")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
77 pub active_item: ActiveItemInfo,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
78 /* XXX actually an enum */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
79 #[serde(rename = "playbackState")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
80 pub playback_state: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
81 pub volume: VolumeInfo,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
82 pub permissions: ApiPermissions,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
83 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
84
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
85 /* {"player": {struct Player}} */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
86 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
87 struct PlayerHelper {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
88 player: Player,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
89 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
90
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
91 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
92 #[serde(untagged)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
93 enum SetPlayerOption {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
94 Integer { id: String, value: i64 },
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
95 Boolean { id: String, value: bool },
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
96 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
97
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
98 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
99 #[serde_with::skip_serializing_none]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
100 struct SetPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
101 /* dB */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
102 volume: Option<f64>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
103 /* ??? */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
104 #[serde(rename = "relativeVolume")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
105 relative_volume: Option<f64>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
106 #[serde(rename = "isMuted")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
107 muted: Option<bool>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
108 position: Option<f64>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
109 #[serde(rename = "relativePosition")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
110 relative_position: Option<f64>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
111 /* teehee */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
112 options: Option<Vec<SetPlayerOption>>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
113 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
114
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
115 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
116 pub struct PlaylistItem {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
117 pub columns: Vec<String>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
118 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
119
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
120 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
121 pub struct PlaylistItems {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
122 pub offset: i64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
123 #[serde(rename = "totalCount")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
124 pub total_count: i64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
125 pub items: Vec<PlaylistItem>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
126 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
127
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
128 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
129 struct PlaylistItemsHelper {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
130 #[serde(rename = "playlistItems")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
131 playlist_items: PlaylistItems,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
132 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
133
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
134 /* --- NOW, THE ACTUAL BEEFWEB THING */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
135
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
136 pub struct Beefweb {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
137 client: reqwest::Client,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
138 base_url: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
139 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
140
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
141 impl Beefweb {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
142 pub fn new(base: &str) -> Beefweb
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
143 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
144 return Beefweb {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
145 client: reqwest::Client::new(),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
146 base_url: base.to_string(),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
147 };
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
148 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
149
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
150 pub async fn player(&self) -> Result<Player, anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
151 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
152 return Ok(self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
153 .get(format!("{}/player", self.base_url))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
154 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
155 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
156 .json::<PlayerHelper>()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
157 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
158 .player);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
159 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
160
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
161 pub async fn volume(&self) -> Result<VolumeInfo, anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
162 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
163 return Ok(self.player().await?.volume);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
164 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
165
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
166 pub async fn position(&self) -> Result<f64, anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
167 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
168 return Ok(self.player().await?.active_item.position);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
169 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
170
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
171 /* XXX might be able to use macros for this? idk --paper */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
172 async fn play_pause_stop(&self, x: &str) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
173 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
174 self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
175 .post(format!("{}/player/{}", self.base_url, x))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
176 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
177 .await?;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
178
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
179 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
180 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
181
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
182 pub async fn play(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
183 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
184 return self.play_pause_stop("play").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
185 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
186
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
187 pub async fn pause(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
188 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
189 return self.play_pause_stop("pause").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
190 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
191
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
192 pub async fn stop(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
193 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
194 return self.play_pause_stop("stop").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
195 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
196
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
197 pub async fn play_pause(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
198 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
199 return self.play_pause_stop("play-pause").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
200 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
201
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
202 pub async fn next(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
203 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
204 return self.play_pause_stop("next").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
205 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
206
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
207 pub async fn previous(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
208 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
209 return self.play_pause_stop("previous").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
210 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
211
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
212 /* XXX what should this return? */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
213 async fn set_player(&self, p: &SetPlayer) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
214 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
215 self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
216 .post(format!("{}/player", self.base_url))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
217 .json::<SetPlayer>(p)
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
218 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
219 .await?;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
220
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
221 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
222 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
223
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
224 pub async fn set_volume(&self, volume: f64) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
225 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
226 return self.set_player(&SetPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
227 volume: Some(volume),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
228 relative_volume: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
229 muted: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
230 position: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
231 relative_position: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
232 options: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
233 }).await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
234 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
235
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
236 pub async fn set_position(&self, position: f64) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
237 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
238 return self.set_player(&SetPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
239 volume: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
240 relative_volume: Some(position),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
241 muted: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
242 position: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
243 relative_position: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
244 options: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
245 }).await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
246 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
247
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
248 pub async fn playlist_items(&self, playlist_id: &str, offset: i64, count: i64, columns: Vec<&str>) -> Result<PlaylistItems, anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
249 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
250 return Ok(self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
251 .get(format!("{}/playlists/{}/items/{}:{}", self.base_url, playlist_id, offset, count))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
252 .query(&[("columns", columns.join(","))])
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
253 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
254 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
255 .json::<PlaylistItemsHelper>()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
256 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
257 .playlist_items);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
258 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
259
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
260 pub async fn artwork(&self, playlist_id: &str, index: i64) -> Result<bytes::Bytes, anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
261 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
262 return Ok(self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
263 .get(format!("{}/artwork/{}/{}", self.base_url, playlist_id, index))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
264 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
265 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
266 .bytes()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
267 .await?);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
268 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
269 }