annotate src/player.rs @ 6:482bd968725f default tip

beefweb: remove unnecessary (de)serialize derives
author Paper <paper@tflc.us>
date Mon, 06 Apr 2026 09:54:05 -0400
parents 8f71820abe71
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
1 /*
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
2 * Beefweb <-> mpris "compatibility" layer.
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
3 *
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
4 * Copyright (C) 2026 Paper
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
5 *
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
6 * This program is free software; you can redistribute it and/or
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
7 * modify it under the terms of the GNU General Public License
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
8 * as published by the Free Software Foundation; either version 2
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
9 * of the License, or (at your option) any later version.
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
10 *
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
11 * This program is distributed in the hope that it will be useful,
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
14 * GNU General Public License for more details.
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
15 *
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
16 * You should have received a copy of the GNU General Public License
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
17 * along with this program; if not, see
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
18 * <https://www.gnu.org/licenses/>.
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
19 */
a5ee18c79a04 license
Paper <paper@tflc.us>
parents: 0
diff changeset
20
5
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
21 /* Fuck off, I don't care. */
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
22 #![allow(nonstandard_style)]
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
23 #![allow(unused_variables)]
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
24
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
25 use crate::beefweb;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
26
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
27 use zbus::fdo;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
28 use zbus::Result;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
29 use std::collections::HashMap;
2
Paper <paper@tflc.us>
parents: 1
diff changeset
30 //use std::io::Write;
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
31 use std::cell::RefCell;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
32
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
33 /* teehee */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
34 pub struct BeefwebPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
35 bw: beefweb::Beefweb,
5
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
36 wc: Option<winepath::WineConfig>,
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
37 artcache: String,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
38 /* artmap
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
39 * key: %path% column from beefweb
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
40 * value: local path of the artwork
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
41 * also LOL RUST FUCK */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
42 artmap: RefCell<HashMap<String, String>>,
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
43 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
44
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
45 impl BeefwebPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
46 pub fn new(base: &str, artcache: &str) -> BeefwebPlayer
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
47 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
48 return BeefwebPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
49 bw: beefweb::Beefweb::new(base),
5
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
50 /* teehee */
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
51 wc: winepath::WineConfig::from_env().ok(),
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
52 artcache: artcache.to_string(),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
53 artmap: RefCell::new(HashMap::new()),
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
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
57 /*
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
58 async fn get_artwork(&self, playlist_id: &str, index: i64, path: &str) -> fdo::Result<String>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
59 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
60 match self.artmap.borrow().get(path) {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
61 Some(x) => return Ok(x.to_string()),
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
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
65 /* Ok, art path isn't in the "cache". Ask beefweb for it. */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
66 let art = self.bw.artwork(playlist_id, index);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
67 let artpath = format!("{}/{}", self.artcache, uuid::Uuid::new_v4());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
68
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
69 /* XXX might be a good idea to check the bytes for an extension...? */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
70 let fr = std::fs::OpenOptions::new()
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
71 .write(true)
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
72 .open(&artpath);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
73
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
74 match fr {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
75 Err(_) => return Err(fdo::Error::Failed("Failed to open file!".to_string())),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
76 _ => (),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
77 };
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
78
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
79 let mut f = fr.unwrap();
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
80
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
81 let artaw = art.await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
82
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
83 match artaw {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
84 Err(_) => return Err(fdo::Error::Failed("Uh oh".to_string())),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
85 _ => (),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
86 };
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
87
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
88 f.write(artaw.unwrap().as_ref());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
89
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
90 self.artmap.borrow_mut().insert(path.to_string(), artpath.to_string());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
91
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
92 return Ok(artpath);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
93 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
94 */
5
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
95
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
96 fn win32_path_to_file_url(&self, p: &str) -> fdo::Result<String>
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
97 {
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
98 match &(self.wc) {
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
99 Some(_) => (),
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
100 _ => { return Err(fdo::Error::Failed("Wine environment not loaded?".into())) },
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
101 };
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
102
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
103 let nps = self.wc.as_ref().unwrap();
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
104
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
105 println!("{:?}", nps.prefix());
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
106
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
107 match nps.to_native_path(p) {
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
108 Ok(v) => {
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
109 match v.to_str() {
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
110 /* hax: don't kill slashes */
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
111 Some(vv) => return Ok(format!("file://{}", urlencoding::encode(vv).replace("%2F", "/"))),
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
112 _ => (),
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
113 };
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
114 },
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
115 /* TODO detect if this is a unix path and use it as such */
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
116 Err(x) => { println!("{}", x); },
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
117 };
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
118
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
119 return Err(fdo::Error::Failed("Converting to unix path failed...".into()));
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
120 }
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
121 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
122
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
123 fn secs_to_time(x: f64) -> mpris_server::Time
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
124 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
125 return mpris_server::Time::from_micros((x * 1000000.0).round() as i64);
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 fn time_to_secs(x: mpris_server::Time) -> f64
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
129 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
130 return (x.as_micros() as f64) / 1000000.0;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
131 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
132
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
133 impl mpris_server::LocalRootInterface for BeefwebPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
134 async fn raise(&self) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
135 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
136 /* don't care */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
137 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
138 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
139
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
140 async fn quit(&self) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
141 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
142 /* don't care */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
143 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
144 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
145
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
146 async fn can_quit(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
147 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
148 /* don't care */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
149 return Ok(false);
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 async fn fullscreen(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
153 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
154 /* don't care */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
155 return Ok(false);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
156 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
157
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
158 async fn set_fullscreen(&self, _fullscreen: bool) -> Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
159 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
160 /* don't care */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
161 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
162 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
163
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
164 async fn can_set_fullscreen(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
165 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
166 return Ok(false);
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 async fn can_raise(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
170 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
171 return Ok(false);
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 async fn has_track_list(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
175 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
176 /* ??? */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
177 return Ok(false);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
178 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
179
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
180 async fn identity(&self) -> fdo::Result<String>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
181 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
182 /* TODO: allow changing this */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
183 return Ok("beefweb".into());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
184 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
185
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
186 async fn desktop_entry(&self) -> fdo::Result<String>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
187 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
188 return Ok("foobar2000".into());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
189 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
190
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
191 async fn supported_uri_schemes(&self) -> fdo::Result<Vec<String>>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
192 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
193 return Ok([].to_vec());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
194 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
195
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
196 async fn supported_mime_types(&self) -> fdo::Result<Vec<String>>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
197 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
198 /* needs moar */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
199 return Ok([].to_vec());
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
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
203 impl mpris_server::LocalPlayerInterface for BeefwebPlayer {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
204 async fn next(&self) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
205 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
206 self.bw.next().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
207 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
208 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
209
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
210 async fn previous(&self) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
211 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
212 self.bw.previous().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
213 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
214 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
215
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
216 async fn pause(&self) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
217 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
218 self.bw.pause().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
219 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
220 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
221
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
222 async fn play_pause(&self) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
223 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
224 self.bw.play_pause().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
225 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
226 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
227
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
228 async fn stop(&self) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
229 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
230 self.bw.stop().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
231 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
232 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
233
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
234 async fn play(&self) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
235 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
236 self.bw.play().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
237 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
238 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
239
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
240 async fn seek(&self, offset: mpris_server::Time) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
241 {
4
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
242 let pl = self.bw.seek(time_to_secs(offset)).await;
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
243
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
244 match pl {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
245 Err(_) => return Err(fdo::Error::Failed("uhoh".to_string())),
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
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
249 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
250 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
251
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
252 async fn position(&self) -> fdo::Result<mpris_server::Time>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
253 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
254 let pl = self.bw.player().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
255
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
256 match pl {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
257 Err(_) => return Err(fdo::Error::Failed("uhoh".to_string())),
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
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
261 return Ok(secs_to_time(pl.unwrap().active_item.position));
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
262 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
263
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
264 async fn playback_status(&self) -> fdo::Result<mpris_server::PlaybackStatus>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
265 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
266 let p = self.bw.player().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
267
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
268 match p {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
269 Err(_) => return Err(fdo::Error::Failed("wtf".to_string())),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
270 _ => (),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
271 };
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
272
2
Paper <paper@tflc.us>
parents: 1
diff changeset
273 return match p.unwrap().playback_state {
Paper <paper@tflc.us>
parents: 1
diff changeset
274 beefweb::PlaybackState::PLAYING => Ok(mpris_server::PlaybackStatus::Playing),
Paper <paper@tflc.us>
parents: 1
diff changeset
275 beefweb::PlaybackState::STOPPED => Ok(mpris_server::PlaybackStatus::Stopped),
Paper <paper@tflc.us>
parents: 1
diff changeset
276 beefweb::PlaybackState::PAUSED => Ok(mpris_server::PlaybackStatus::Paused),
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
277 };
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
278 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
279
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
280 async fn loop_status(&self) -> fdo::Result<mpris_server::LoopStatus>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
281 {
2
Paper <paper@tflc.us>
parents: 1
diff changeset
282 /* TODO -- we can do this w/ self.bw.playback_order() */
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
283 return Ok(mpris_server::LoopStatus::None);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
284 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
285
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
286 async fn set_loop_status(&self, loop_status: mpris_server::LoopStatus) -> Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
287 {
2
Paper <paper@tflc.us>
parents: 1
diff changeset
288 /* TODO -- implement self.bw.set_playback_order() */
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
289 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
290 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
291
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
292 async fn shuffle(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
293 {
2
Paper <paper@tflc.us>
parents: 1
diff changeset
294 /* TODO -- we can do this w/ self.bw.playback_order() */
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
295 println!("Shuffle");
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
296 return Ok(false);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
297 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
298
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
299 async fn set_shuffle(&self, shuffle: bool) -> Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
300 {
2
Paper <paper@tflc.us>
parents: 1
diff changeset
301 /* TODO -- implement self.bw.set_playback_order() */
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
302 println!("SetShuffle({shuffle})");
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 async fn metadata(&self) -> fdo::Result<mpris_server::Metadata>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
307 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
308 let pl = self.bw.player().await;
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
309
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
310 match pl {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
311 Err(_) => return Err(fdo::Error::Failed("uhoh".to_string())),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
312 _ => (),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
313 };
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
314
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
315 let p = pl.unwrap();
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
316
3
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
317 let playlist_items_result = self.bw.playlist_item(p.active_item.playlist_id.as_str(), p.active_item.index, &["%title%", "%artist%", "%album%", "%discnumber%", "%tracknumber%", "%album artist%", "%path%", "%bpm%", "%composer%", "%comment%", "%date%", "%genre%", "%lyricist%"].to_vec()).await;
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
318
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
319 match playlist_items_result {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
320 Err(_) => return Err(fdo::Error::Failed("uhoh".to_string())),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
321 _ => (),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
322 };
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
323
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
324 let playlist_items = playlist_items_result.unwrap();
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
325
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
326 let track = playlist_items.items.get(0).unwrap();
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
327
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
328 /*
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
329 let artwork = self.get_artwork(p.active_item.playlist_id.as_str(), p.active_item.index, track.columns.get(6).unwrap());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
330 */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
331
3
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
332 let mut x = mpris_server::Metadata::new();
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
333
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
334 x.set_length(Some(secs_to_time(p.active_item.duration)));
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
335 if track.columns.len() >= 13 {
5
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
336 let path = track.columns.get(6).unwrap();
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
337
3
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
338 x.set_title(Some(track.columns.get(0).unwrap()));
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
339 /* XXX musicbrainz has %artists% we can use for a proper list */
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
340 x.set_artist(Some([track.columns.get(1).unwrap()]));
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
341 x.set_album(Some(track.columns.get(2).unwrap()));
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
342 match track.columns.get(3).unwrap().parse::<i32>() {
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
343 Ok(v) => { x.set_disc_number(Some(v)); },
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
344 _ => (),
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
345 };
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
346 match track.columns.get(4).unwrap().parse::<i32>() {
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
347 Ok(v) => { x.set_track_number(Some(v)); },
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
348 _ => (),
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
349 };
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
350 x.set_album_artist(Some([track.columns.get(5).unwrap()]));
5
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
351 x.set_trackid(Some(mpris_server::TrackId::from(zbus::zvariant::ObjectPath::from_string_unchecked(format!("/org/foobar2000/foobar2000/trackids/{}", hex::encode(path))))));
3
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
352 /* Why is this an i32 ??? It would make more sense as f32 or f64 */
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
353 match track.columns.get(7).unwrap().parse::<i32>() {
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
354 Ok(v) => { x.set_audio_bpm(Some(v)) },
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
355 _ => (),
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
356 };
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
357 x.set_composer(Some([track.columns.get(8).unwrap()]));
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
358 x.set_comment(Some([track.columns.get(9).unwrap()]));
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
359 x.set_content_created(Some(track.columns.get(10).unwrap()));
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
360 x.set_genre(Some(track.columns.get(11).unwrap().split(";")));
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
361 x.set_lyricist(Some([track.columns.get(12).unwrap()]));
5
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
362
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
363 /* add file:// URI */
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
364 match self.win32_path_to_file_url(path) {
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
365 Ok(a) => { x.set_url(Some(a)); },
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
366 /* If it failed, it's more than likely a URL already,
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
367 * pointing to a stream */
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
368 Err(_) => { x.set_url(Some(path)); },
8f71820abe71 player: use winepath for URLs
Paper <paper@tflc.us>
parents: 4
diff changeset
369 };
3
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
370 }
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
371
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
372 /*
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
373 return match artwork.await {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
374 Ok(x) => Ok(builder.art_url(urlencoding::encode(format!("file://{}", x).as_str())).build()),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
375 _ => Ok(builder.build()),
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
376 };
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
377 */
3
18f743c980fa make this a bit more sane
Paper <paper@tflc.us>
parents: 2
diff changeset
378 return Ok(x);
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
379 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
380
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
381 async fn volume(&self) -> fdo::Result<mpris_server::Volume>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
382 {
2
Paper <paper@tflc.us>
parents: 1
diff changeset
383 let vr = self.bw.volume().await;
Paper <paper@tflc.us>
parents: 1
diff changeset
384
Paper <paper@tflc.us>
parents: 1
diff changeset
385 match vr {
Paper <paper@tflc.us>
parents: 1
diff changeset
386 Err(_) => return Err(fdo::Error::Failed("uhoh".to_string())),
Paper <paper@tflc.us>
parents: 1
diff changeset
387 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
388 }
Paper <paper@tflc.us>
parents: 1
diff changeset
389
Paper <paper@tflc.us>
parents: 1
diff changeset
390 let v = vr.unwrap();
Paper <paper@tflc.us>
parents: 1
diff changeset
391
Paper <paper@tflc.us>
parents: 1
diff changeset
392 /* dB -> linear */
Paper <paper@tflc.us>
parents: 1
diff changeset
393 return Ok(match v.r#type {
Paper <paper@tflc.us>
parents: 1
diff changeset
394 beefweb::VolumeType::DB => 10.0_f64.powf(v.value / 20.0),
Paper <paper@tflc.us>
parents: 1
diff changeset
395 beefweb::VolumeType::LINEAR => v.value,
Paper <paper@tflc.us>
parents: 1
diff changeset
396 beefweb::VolumeType::UPDOWN => /* ??? */ v.value,
Paper <paper@tflc.us>
parents: 1
diff changeset
397 });
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
398 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
399
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
400 async fn set_volume(&self, volume: mpris_server::Volume) -> Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
401 {
2
Paper <paper@tflc.us>
parents: 1
diff changeset
402 /* linear -> dB */
Paper <paper@tflc.us>
parents: 1
diff changeset
403 let v = 20.0 * volume.log10();
Paper <paper@tflc.us>
parents: 1
diff changeset
404
Paper <paper@tflc.us>
parents: 1
diff changeset
405 match self.bw.set_volume(v).await {
Paper <paper@tflc.us>
parents: 1
diff changeset
406 Err(_) => return Err(zbus::Error::Failure("uhoh".to_string())),
Paper <paper@tflc.us>
parents: 1
diff changeset
407 _ => (),
Paper <paper@tflc.us>
parents: 1
diff changeset
408 }
Paper <paper@tflc.us>
parents: 1
diff changeset
409
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
410 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
411 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
412
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
413 /* "can" functions -- all work */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
414
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
415 async fn can_go_next(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
416 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
417 return Ok(true);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
418 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
419
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
420 async fn can_go_previous(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
421 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
422 return Ok(true);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
423 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
424
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
425 async fn can_play(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
426 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
427 return Ok(true);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
428 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
429
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
430 async fn can_pause(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
431 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
432 return Ok(true);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
433 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
434
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
435 async fn can_seek(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
436 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
437 return Ok(true);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
438 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
439
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
440 async fn can_control(&self) -> fdo::Result<bool>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
441 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
442 return Ok(true);
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
443 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
444
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
445 /* --- UNSUPPORTED */
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
446
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
447 async fn rate(&self) -> fdo::Result<mpris_server::PlaybackRate>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
448 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
449 return Ok(mpris_server::PlaybackRate::default());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
450 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
451
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
452 async fn set_rate(&self, rate: mpris_server::PlaybackRate) -> Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
453 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
454 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
455 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
456
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
457 async fn minimum_rate(&self) -> fdo::Result<mpris_server::PlaybackRate>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
458 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
459 return Ok(mpris_server::PlaybackRate::default());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
460 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
461
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
462 async fn maximum_rate(&self) -> fdo::Result<mpris_server::PlaybackRate>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
463 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
464 return Ok(mpris_server::PlaybackRate::default());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
465 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
466
4
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
467 /* FIXME to implement this we would have to search through each playlist
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
468 * for the track, and if it doesn't exist, append it to the current playlist.
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
469 *
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
470 * THEN we can add it directly into the play queue. */
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
471 async fn set_position(&self, track_id: mpris_server::TrackId, position: mpris_server::Time) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
472 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
473 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
474 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
475
4
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
476 /* TODO:
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
477 *
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
478 * We can effectively implement this "proper" by detecting a file://
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
479 * path, URL decoding it, and prepending "Z:". */
0
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
480 async fn open_uri(&self, uri: String) -> fdo::Result<()>
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
481 {
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
482 return Ok(());
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
483 }
d60ab8a4442f *: check in
Paper <paper@tflc.us>
parents:
diff changeset
484 }
4
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
485
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
486 /* -- unfinished impl, don't mind this
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
487
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
488
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
489 impl mpris_server::LocalPlaylistsInterface for BeefwebPlayer {
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
490 async fn activate_playlist(&self, playlist_id: mpris_server::PlaylistId) -> fdo::Result<()>
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
491 {
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
492 return Err(fdo::Error::Failed("uhoh".to_string()));
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
493 }
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
494
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
495 async fn get_playlists(&self, index: u32, max_count: u32, order: mpris_server::PlaylistOrdering, reverse_order: bool) -> fdo::Result<Vec<mpris_server::Playlist>>
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
496 {
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
497 let mut v: Vec<mpris_server::Playlist> = Vec::new();
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
498
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
499 let playlists = self.bw.playlists().await;
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
500
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
501 match playlists {
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
502 Ok(ref v) => (),
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
503 _ => return Err(fdo::Error::Failed("req failed".to_string())),
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
504 }
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
505
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
506 for playlist in playlists.unwrap() {
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
507
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
508 }
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
509
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
510 return Err(fdo::Error::Failed("uhoh".to_string()));
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
511 }
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
512
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
513 async fn playlist_count(&self) -> fdo::Result<u32>
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
514 {
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
515 return Err(fdo::Error::Failed("unimpl".to_string()));
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
516 }
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
517
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
518 async fn orderings(&self) -> fdo::Result<Vec<mpris_server::PlaylistOrdering>>
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
519 {
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
520 todo!()
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
521 }
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
522
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
523 async fn active_playlist(&self) -> fdo::Result<Option<mpris_server::Playlist>>
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
524 {
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
525 todo!()
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
526 }
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
527 }
26f695129c86 *: fixes
Paper <paper@tflc.us>
parents: 3
diff changeset
528 */