@@ -5,10 +5,11 @@ use std::time::{SystemTime, UNIX_EPOCH};
55use anyhow:: { bail, Error } ;
66use anyhow:: { Context , Result } ;
77use log:: { debug, error, info} ;
8- use sea_orm:: DatabaseConnection ;
8+ use sea_orm:: { DatabaseConnection , TransactionTrait } ;
99use tokio:: sync:: Mutex ;
1010use tokio:: task;
1111
12+ use database:: actions:: logging:: insert_log;
1213use database:: actions:: playback_queue:: replace_playback_queue;
1314use database:: actions:: stats:: increase_played_through;
1415use database:: connection:: MainDbConnection ;
@@ -29,12 +30,12 @@ use scrobbling::ScrobblingTrack;
2930use crate :: { CrashResponse , PlaybackStatus , PlaylistItem , PlaylistUpdate , RealtimeFft } ;
3031
3132pub fn metadata_summary_to_scrobbling_track (
32- metadata : PlayingItemMetadataSummary ,
33+ metadata : & PlayingItemMetadataSummary ,
3334) -> ScrobblingTrack {
3435 ScrobblingTrack {
35- artist : metadata. artist ,
36- album : Some ( metadata. album ) ,
37- track : metadata. title ,
36+ artist : metadata. artist . clone ( ) ,
37+ album : Some ( metadata. album . clone ( ) ) ,
38+ track : metadata. title . clone ( ) ,
3839 duration : Some ( metadata. duration . clamp ( 0.0 , u32:: MAX as f64 ) as u32 ) ,
3940 album_artist : None ,
4041 timestamp : Some (
@@ -61,13 +62,17 @@ pub async fn initialize_player(
6162 let main_db_for_status = Arc :: clone ( & main_db) ;
6263 let main_db_for_played_throudh = Arc :: clone ( & main_db) ;
6364 let main_db_for_playlist = Arc :: clone ( & main_db) ;
65+ let main_db_for_error_reporter = Arc :: clone ( & main_db) ;
6466
6567 let manager = Arc :: new ( Mutex :: new ( MediaControlManager :: new ( ) ?) ) ;
6668
6769 let os_controller_receiver = manager. lock ( ) . await . subscribe_controller_events ( ) ;
6870 let dispatcher = Arc :: new ( Mutex :: new ( PlayingItemActionDispatcher :: new ( ) ) ) ;
6971 let dispatcher_for_played_through = Arc :: clone ( & dispatcher) ;
7072
73+ let scrobber_for_played_through = Arc :: clone ( & scrobbler) ;
74+ let scrobber_for_error_reporter = Arc :: clone ( & scrobbler) ;
75+
7176 manager. lock ( ) . await . initialize ( ) ?;
7277
7378 info ! ( "Initializing event listeners" ) ;
@@ -137,6 +142,9 @@ pub async fn initialize_player(
137142 ) ;
138143 }
139144 } ;
145+
146+ let track = metadata_summary_to_scrobbling_track ( metadata) ;
147+ scrobbler. lock ( ) . await . update_now_playing_all ( track) ;
140148 }
141149 None => {
142150 error ! ( "No metadata found for: {:?}" , item_clone_for_status) ;
@@ -215,6 +223,7 @@ pub async fn initialize_player(
215223 task:: spawn ( async move {
216224 let main_db = Arc :: clone ( & main_db_for_played_throudh) ;
217225 let dispatcher = Arc :: clone ( & dispatcher_for_played_through) ;
226+ let scrobbler = Arc :: clone ( & scrobber_for_played_through) ;
218227
219228 while let Ok ( item) = played_through_receiver. recv ( ) . await {
220229 match item {
@@ -242,7 +251,7 @@ pub async fn initialize_player(
242251 }
243252
244253 let metadata: PlayingItemMetadataSummary = metadata[ 0 ] . clone ( ) ;
245- let track: ScrobblingTrack = metadata_summary_to_scrobbling_track ( metadata) ;
254+ let track: ScrobblingTrack = metadata_summary_to_scrobbling_track ( & metadata) ;
246255
247256 scrobbler. lock ( ) . await . scrobble_all ( track) ;
248257 }
@@ -255,6 +264,41 @@ pub async fn initialize_player(
255264 }
256265 } ) ;
257266
267+ task:: spawn ( async move {
268+ let main_db = Arc :: clone ( & main_db_for_error_reporter) ;
269+
270+ let scrobbler = Arc :: clone ( & scrobber_for_error_reporter) ;
271+ let error_receiver = scrobbler. lock ( ) . await . subscribe_error ( ) ;
272+
273+ while let Ok ( error) = error_receiver. recv ( ) . await {
274+ error ! (
275+ "Scrobbler received error: {:?}::{:?}: {:#?}" ,
276+ error. service, error. action, error. error
277+ ) ;
278+
279+ match main_db. begin ( ) . await {
280+ Ok ( txn) => {
281+ if let Err ( e) = insert_log (
282+ & txn,
283+ database:: actions:: logging:: LogLevel :: Error ,
284+ format ! ( "scrobbler::{:?}::{:?}" , error. action, error. service) ,
285+ format ! ( "{:#?}" , error) ,
286+ )
287+ . await
288+ {
289+ error ! ( "Failed to log scrobbler error: {:#?}" , e) ;
290+ }
291+ }
292+ Err ( e) => {
293+ error ! (
294+ "Failed to start txn while logging scrobbler error: {:#?}" ,
295+ e
296+ ) ;
297+ }
298+ }
299+ }
300+ } ) ;
301+
258302 task:: spawn ( async move {
259303 let player = Arc :: clone ( & player) ;
260304
0 commit comments