annotate src/beefweb.rs @ 3:18f743c980fa

make this a bit more sane
author Paper <paper@tflc.us>
date Sat, 04 Apr 2026 17:03:22 -0400
parents 594c0f9d7972
children 26f695129c86
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
2
Paper <paper@tflc.us>
parents: 1
diff changeset
21 /* Fuck off, I don't care. */
Paper <paper@tflc.us>
parents: 1
diff changeset
22 #![allow(nonstandard_style)]
Paper <paper@tflc.us>
parents: 1
diff changeset
23
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
24 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
25 pub struct PlayerInfo {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
26 pub name: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
27 pub title: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
28 pub version: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
29 // fuck camel case
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
30 #[serde(rename = "pluginVersion")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
31 pub plugin_version: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
32 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
33
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
34 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
35 pub struct ActiveItemInfo {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
36 #[serde(rename = "playlistId")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
37 pub playlist_id: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
38 #[serde(rename = "playlistIndex")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
39 pub playlist_index: i64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
40 pub index: i64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
41 pub position: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
42 pub duration: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
43 pub columns: Vec<String>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
44 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
45
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
46 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
47 pub enum VolumeType {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
48 #[serde(rename = "db")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
49 DB,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
50 #[serde(rename = "linear")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
51 LINEAR,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
52 #[serde(rename = "upDown")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
53 UPDOWN, /* ??? */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
54 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
55
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
56 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
57 pub struct VolumeInfo {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
58 pub r#type: VolumeType,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
59 pub min: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
60 pub max: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
61 pub value: f64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
62 #[serde(rename = "isMuted")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
63 pub muted: bool,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
64 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
65
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
66 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
67 pub struct ApiPermissions {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
68 #[serde(rename = "changePlaylists")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
69 pub change_playlists: bool,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
70 #[serde(rename = "changeOutput")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
71 pub change_output: bool,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
72 #[serde(rename = "changeClientConfig")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
73 pub change_client_config: bool,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
74 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
75
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
76 #[derive(serde::Serialize, serde::Deserialize, Debug)]
2
Paper <paper@tflc.us>
parents: 1
diff changeset
77 pub enum PlaybackState {
Paper <paper@tflc.us>
parents: 1
diff changeset
78 #[serde(rename = "stopped")]
Paper <paper@tflc.us>
parents: 1
diff changeset
79 STOPPED,
Paper <paper@tflc.us>
parents: 1
diff changeset
80 #[serde(rename = "playing")]
Paper <paper@tflc.us>
parents: 1
diff changeset
81 PLAYING,
Paper <paper@tflc.us>
parents: 1
diff changeset
82 #[serde(rename = "paused")]
Paper <paper@tflc.us>
parents: 1
diff changeset
83 PAUSED,
Paper <paper@tflc.us>
parents: 1
diff changeset
84 }
Paper <paper@tflc.us>
parents: 1
diff changeset
85
Paper <paper@tflc.us>
parents: 1
diff changeset
86 /* fb2k playback order */
Paper <paper@tflc.us>
parents: 1
diff changeset
87 #[derive(Debug)]
Paper <paper@tflc.us>
parents: 1
diff changeset
88 pub enum PlaybackOrder {
Paper <paper@tflc.us>
parents: 1
diff changeset
89 DEFAULT,
Paper <paper@tflc.us>
parents: 1
diff changeset
90 REPEAT_PLAYLIST,
Paper <paper@tflc.us>
parents: 1
diff changeset
91 REPEAT_TRACK,
Paper <paper@tflc.us>
parents: 1
diff changeset
92 RANDOM,
Paper <paper@tflc.us>
parents: 1
diff changeset
93 SHUFFLE_TRACKS,
Paper <paper@tflc.us>
parents: 1
diff changeset
94 SHUFFLE_ALBUMS,
Paper <paper@tflc.us>
parents: 1
diff changeset
95 SHUFFLE_FOLDERS,
Paper <paper@tflc.us>
parents: 1
diff changeset
96 }
Paper <paper@tflc.us>
parents: 1
diff changeset
97
Paper <paper@tflc.us>
parents: 1
diff changeset
98 #[derive(serde::Serialize, serde::Deserialize, Debug)]
Paper <paper@tflc.us>
parents: 1
diff changeset
99 #[serde(tag = "type")]
Paper <paper@tflc.us>
parents: 1
diff changeset
100 pub enum Options {
Paper <paper@tflc.us>
parents: 1
diff changeset
101 #[serde(rename = "enum")]
Paper <paper@tflc.us>
parents: 1
diff changeset
102 Enumeration {
Paper <paper@tflc.us>
parents: 1
diff changeset
103 #[serde(rename = "enumNames")]
Paper <paper@tflc.us>
parents: 1
diff changeset
104 enum_names: Vec<String>,
Paper <paper@tflc.us>
parents: 1
diff changeset
105 id: String,
Paper <paper@tflc.us>
parents: 1
diff changeset
106 name: String,
Paper <paper@tflc.us>
parents: 1
diff changeset
107 value: i64,
Paper <paper@tflc.us>
parents: 1
diff changeset
108 },
Paper <paper@tflc.us>
parents: 1
diff changeset
109 #[serde(rename = "bool")]
Paper <paper@tflc.us>
parents: 1
diff changeset
110 Boolean {
Paper <paper@tflc.us>
parents: 1
diff changeset
111 id: String,
Paper <paper@tflc.us>
parents: 1
diff changeset
112 name: String,
Paper <paper@tflc.us>
parents: 1
diff changeset
113 value: bool,
Paper <paper@tflc.us>
parents: 1
diff changeset
114 },
Paper <paper@tflc.us>
parents: 1
diff changeset
115 }
Paper <paper@tflc.us>
parents: 1
diff changeset
116
Paper <paper@tflc.us>
parents: 1
diff changeset
117 #[derive(serde::Serialize, serde::Deserialize, Debug)]
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
118 pub struct Player {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
119 pub info: PlayerInfo,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
120 #[serde(rename = "activeItem")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
121 pub active_item: ActiveItemInfo,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
122 /* XXX actually an enum */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
123 #[serde(rename = "playbackState")]
2
Paper <paper@tflc.us>
parents: 1
diff changeset
124 pub playback_state: PlaybackState,
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
125 pub volume: VolumeInfo,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
126 pub permissions: ApiPermissions,
2
Paper <paper@tflc.us>
parents: 1
diff changeset
127
Paper <paper@tflc.us>
parents: 1
diff changeset
128 options: Option<Vec<Options>>,
Paper <paper@tflc.us>
parents: 1
diff changeset
129
Paper <paper@tflc.us>
parents: 1
diff changeset
130 /* these two fields are deprecated,
Paper <paper@tflc.us>
parents: 1
diff changeset
131 * replaced with "options" array */
Paper <paper@tflc.us>
parents: 1
diff changeset
132 #[serde(skip_serializing_if = "Option::is_none")]
Paper <paper@tflc.us>
parents: 1
diff changeset
133 playbackMode: Option<i64>,
Paper <paper@tflc.us>
parents: 1
diff changeset
134
Paper <paper@tflc.us>
parents: 1
diff changeset
135 #[serde(skip_serializing_if = "Option::is_none")]
Paper <paper@tflc.us>
parents: 1
diff changeset
136 playbackModes: Option<Vec<String>>,
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
137 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
138
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
139 /* {"player": {struct Player}} */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
140 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
141 struct PlayerHelper {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
142 player: Player,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
143 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
144
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
145 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
146 #[serde(untagged)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
147 enum SetPlayerOption {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
148 Integer { id: String, value: i64 },
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
149 Boolean { id: String, value: bool },
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
150 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
151
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
152 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
153 #[serde_with::skip_serializing_none]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
154 struct SetPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
155 /* dB */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
156 volume: Option<f64>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
157 /* ??? */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
158 #[serde(rename = "relativeVolume")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
159 relative_volume: Option<f64>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
160 #[serde(rename = "isMuted")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
161 muted: Option<bool>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
162 position: Option<f64>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
163 #[serde(rename = "relativePosition")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
164 relative_position: Option<f64>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
165 /* teehee */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
166 options: Option<Vec<SetPlayerOption>>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
167 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
168
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
169 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
170 pub struct PlaylistItem {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
171 pub columns: Vec<String>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
172 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
173
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
174 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
175 pub struct PlaylistItems {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
176 pub offset: i64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
177 #[serde(rename = "totalCount")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
178 pub total_count: i64,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
179 pub items: Vec<PlaylistItem>,
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 #[derive(serde::Serialize, serde::Deserialize, Debug)]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
183 struct PlaylistItemsHelper {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
184 #[serde(rename = "playlistItems")]
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
185 playlist_items: PlaylistItems,
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 /* --- NOW, THE ACTUAL BEEFWEB THING */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
189
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
190 pub struct Beefweb {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
191 client: reqwest::Client,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
192 base_url: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
193 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
194
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
195 impl Beefweb {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
196 pub fn new(base: &str) -> Beefweb
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
197 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
198 return Beefweb {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
199 client: reqwest::Client::new(),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
200 base_url: base.to_string(),
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
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
204 pub async fn player(&self) -> Result<Player, anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
205 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
206 return Ok(self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
207 .get(format!("{}/player", self.base_url))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
208 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
209 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
210 .json::<PlayerHelper>()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
211 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
212 .player);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
213 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
214
2
Paper <paper@tflc.us>
parents: 1
diff changeset
215 fn playback_order_lookup(playback_order: &str) -> Option<PlaybackOrder>
Paper <paper@tflc.us>
parents: 1
diff changeset
216 {
Paper <paper@tflc.us>
parents: 1
diff changeset
217 return match playback_order {
Paper <paper@tflc.us>
parents: 1
diff changeset
218 "Default" => return Some(PlaybackOrder::DEFAULT),
Paper <paper@tflc.us>
parents: 1
diff changeset
219 "Repeat (playlist)" => return Some(PlaybackOrder::REPEAT_PLAYLIST),
Paper <paper@tflc.us>
parents: 1
diff changeset
220 "Repeat (track)" => return Some(PlaybackOrder::REPEAT_TRACK),
Paper <paper@tflc.us>
parents: 1
diff changeset
221 "Random" => return Some(PlaybackOrder::RANDOM),
Paper <paper@tflc.us>
parents: 1
diff changeset
222 "Shuffle (tracks)" => return Some(PlaybackOrder::SHUFFLE_TRACKS),
Paper <paper@tflc.us>
parents: 1
diff changeset
223 "Shuffle (albums)" => return Some(PlaybackOrder::SHUFFLE_ALBUMS),
Paper <paper@tflc.us>
parents: 1
diff changeset
224 "Shuffle (folders)" => return Some(PlaybackOrder::SHUFFLE_FOLDERS),
Paper <paper@tflc.us>
parents: 1
diff changeset
225 _ => None,
Paper <paper@tflc.us>
parents: 1
diff changeset
226 };
Paper <paper@tflc.us>
parents: 1
diff changeset
227 }
Paper <paper@tflc.us>
parents: 1
diff changeset
228
Paper <paper@tflc.us>
parents: 1
diff changeset
229 fn playback_order_cruft(v: &Vec<String>, s: i64) -> Option<PlaybackOrder>
Paper <paper@tflc.us>
parents: 1
diff changeset
230 {
Paper <paper@tflc.us>
parents: 1
diff changeset
231 let x = v.get(s as usize);
Paper <paper@tflc.us>
parents: 1
diff changeset
232
Paper <paper@tflc.us>
parents: 1
diff changeset
233 match x {
Paper <paper@tflc.us>
parents: 1
diff changeset
234 Some(y) => return Self::playback_order_lookup(y),
Paper <paper@tflc.us>
parents: 1
diff changeset
235 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
236 };
Paper <paper@tflc.us>
parents: 1
diff changeset
237
Paper <paper@tflc.us>
parents: 1
diff changeset
238 return None;
Paper <paper@tflc.us>
parents: 1
diff changeset
239 }
Paper <paper@tflc.us>
parents: 1
diff changeset
240
Paper <paper@tflc.us>
parents: 1
diff changeset
241 pub async fn playback_order(&self) -> Result<PlaybackOrder, anyhow::Error>
Paper <paper@tflc.us>
parents: 1
diff changeset
242 {
Paper <paper@tflc.us>
parents: 1
diff changeset
243 let p = self.player().await?;
Paper <paper@tflc.us>
parents: 1
diff changeset
244
Paper <paper@tflc.us>
parents: 1
diff changeset
245 match p.options {
Paper <paper@tflc.us>
parents: 1
diff changeset
246 Some(x) => {
Paper <paper@tflc.us>
parents: 1
diff changeset
247 for i in x {
Paper <paper@tflc.us>
parents: 1
diff changeset
248 match i {
Paper <paper@tflc.us>
parents: 1
diff changeset
249 Options::Enumeration { enum_names: e, id: id, name: _, value: v } => {
Paper <paper@tflc.us>
parents: 1
diff changeset
250 match id.as_str() {
Paper <paper@tflc.us>
parents: 1
diff changeset
251 "playbackOrder" => {
Paper <paper@tflc.us>
parents: 1
diff changeset
252 match Self::playback_order_cruft(&e, v) {
Paper <paper@tflc.us>
parents: 1
diff changeset
253 Some(z) => return Ok(z),
Paper <paper@tflc.us>
parents: 1
diff changeset
254 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
255 };
Paper <paper@tflc.us>
parents: 1
diff changeset
256 },
Paper <paper@tflc.us>
parents: 1
diff changeset
257 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
258 };
Paper <paper@tflc.us>
parents: 1
diff changeset
259 },
Paper <paper@tflc.us>
parents: 1
diff changeset
260 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
261 };
Paper <paper@tflc.us>
parents: 1
diff changeset
262 }
Paper <paper@tflc.us>
parents: 1
diff changeset
263 },
Paper <paper@tflc.us>
parents: 1
diff changeset
264 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
265 }
Paper <paper@tflc.us>
parents: 1
diff changeset
266
Paper <paper@tflc.us>
parents: 1
diff changeset
267 match p.playbackModes {
Paper <paper@tflc.us>
parents: 1
diff changeset
268 Some(x) => {
Paper <paper@tflc.us>
parents: 1
diff changeset
269 match p.playbackMode {
Paper <paper@tflc.us>
parents: 1
diff changeset
270 Some(y) => {
Paper <paper@tflc.us>
parents: 1
diff changeset
271 match Self::playback_order_cruft(&x, y) {
Paper <paper@tflc.us>
parents: 1
diff changeset
272 Some(v) => return Ok(v),
Paper <paper@tflc.us>
parents: 1
diff changeset
273 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
274 }
Paper <paper@tflc.us>
parents: 1
diff changeset
275 },
Paper <paper@tflc.us>
parents: 1
diff changeset
276 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
277 };
Paper <paper@tflc.us>
parents: 1
diff changeset
278 }
Paper <paper@tflc.us>
parents: 1
diff changeset
279 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
280 }
Paper <paper@tflc.us>
parents: 1
diff changeset
281
Paper <paper@tflc.us>
parents: 1
diff changeset
282 return Err(anyhow::anyhow!("Unknown or invalid playback order?"));
Paper <paper@tflc.us>
parents: 1
diff changeset
283 }
Paper <paper@tflc.us>
parents: 1
diff changeset
284
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
285 pub async fn volume(&self) -> Result<VolumeInfo, anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
286 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
287 return Ok(self.player().await?.volume);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
288 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
289
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
290 pub async fn position(&self) -> Result<f64, anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
291 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
292 return Ok(self.player().await?.active_item.position);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
293 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
294
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
295 /* XXX might be able to use macros for this? idk --paper */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
296 async fn play_pause_stop(&self, x: &str) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
297 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
298 self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
299 .post(format!("{}/player/{}", self.base_url, x))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
300 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
301 .await?;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
302
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
303 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
304 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
305
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
306 pub async fn play(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
307 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
308 return self.play_pause_stop("play").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
309 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
310
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
311 pub async fn pause(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
312 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
313 return self.play_pause_stop("pause").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
314 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
315
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
316 pub async fn stop(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
317 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
318 return self.play_pause_stop("stop").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
319 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
320
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
321 pub async fn play_pause(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
322 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
323 return self.play_pause_stop("play-pause").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
324 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
325
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
326 pub async fn next(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
327 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
328 return self.play_pause_stop("next").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
329 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
330
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
331 pub async fn previous(&self) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
332 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
333 return self.play_pause_stop("previous").await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
334 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
335
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
336 /* XXX what should this return? */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
337 async fn set_player(&self, p: &SetPlayer) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
338 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
339 self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
340 .post(format!("{}/player", self.base_url))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
341 .json::<SetPlayer>(p)
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
342 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
343 .await?;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
344
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
345 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
346 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
347
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
348 pub async fn set_volume(&self, volume: f64) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
349 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
350 return self.set_player(&SetPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
351 volume: Some(volume),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
352 relative_volume: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
353 muted: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
354 position: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
355 relative_position: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
356 options: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
357 }).await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
358 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
359
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
360 pub async fn set_position(&self, position: f64) -> Result<(), anyhow::Error>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
361 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
362 return self.set_player(&SetPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
363 volume: None,
2
Paper <paper@tflc.us>
parents: 1
diff changeset
364 relative_volume: None,
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
365 muted: None,
2
Paper <paper@tflc.us>
parents: 1
diff changeset
366 position: Some(position),
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
367 relative_position: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
368 options: None,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
369 }).await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
370 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
371
2
Paper <paper@tflc.us>
parents: 1
diff changeset
372 /* TODO -- finish this; need to link between string and enum
Paper <paper@tflc.us>
parents: 1
diff changeset
373
Paper <paper@tflc.us>
parents: 1
diff changeset
374 pub async fn set_playback_order(&self, ) -> Result<(), anyhow::Error>
Paper <paper@tflc.us>
parents: 1
diff changeset
375 {
Paper <paper@tflc.us>
parents: 1
diff changeset
376 let p = self.set_player(&SetPlayer {
Paper <paper@tflc.us>
parents: 1
diff changeset
377 volume: None,
Paper <paper@tflc.us>
parents: 1
diff changeset
378 relative_volume: None,
Paper <paper@tflc.us>
parents: 1
diff changeset
379 muted: None,
Paper <paper@tflc.us>
parents: 1
diff changeset
380 position: None,
Paper <paper@tflc.us>
parents: 1
diff changeset
381 relative_position: None,
Paper <paper@tflc.us>
parents: 1
diff changeset
382 options:
Paper <paper@tflc.us>
parents: 1
diff changeset
383 })
Paper <paper@tflc.us>
parents: 1
diff changeset
384 }
Paper <paper@tflc.us>
parents: 1
diff changeset
385 */
Paper <paper@tflc.us>
parents: 1
diff changeset
386
3
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
387 pub async fn playlist_items(&self, playlist_id: &str, offset: i64, count: i64, columns: &Vec<&str>) -> Result<PlaylistItems, anyhow::Error>
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
388 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
389 return Ok(self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
390 .get(format!("{}/playlists/{}/items/{}:{}", self.base_url, playlist_id, offset, count))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
391 .query(&[("columns", columns.join(","))])
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
392 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
393 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
394 .json::<PlaylistItemsHelper>()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
395 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
396 .playlist_items);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
397 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
398
3
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
399 pub async fn playlist_item(&self, playlist_id: &str, index: i64, columns: &Vec<&str>) -> Result<PlaylistItems, anyhow::Error>
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
400 {
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
401 return self.playlist_items(playlist_id, index, 1, columns).await;
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
402 }
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
403
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
404 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
405 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
406 return Ok(self.client
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
407 .get(format!("{}/artwork/{}/{}", self.base_url, playlist_id, index))
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
408 .send()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
409 .await?
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
410 .bytes()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
411 .await?);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
412 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
413 }