annotate src/beefweb.rs @ 0:d60ab8a4442f

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