@@ -286,6 +286,18 @@ fn construct_playback_text(
286286 ui. theme . playback_album ( ) ,
287287 ) ,
288288 } ,
289+ "{genres}" => match playable {
290+ rspotify:: model:: PlayableItem :: Track ( full_track) => {
291+ let genre = match data. caches . genres . get ( & full_track. artists [ 0 ] . name ) {
292+ Some ( genres) => & format_genres ( genres, configs. app_config . genre_num ) ,
293+ None => "no genre" ,
294+ } ;
295+ ( to_bidi_string ( genre) , ui. theme . playback_genres ( ) )
296+ }
297+ rspotify:: model:: PlayableItem :: Episode ( _) => {
298+ ( to_bidi_string ( "no genre" ) , ui. theme . playback_genres ( ) )
299+ }
300+ } ,
289301 "{metadata}" => {
290302 let repeat_value = if playback. fake_track_repeat_state {
291303 "track (fake)" . to_string ( )
@@ -457,3 +469,30 @@ fn split_rect_for_playback_window(rect: Rect) -> (Rect, Rect) {
457469 }
458470 }
459471}
472+
473+ /// formats genres depending on the number of genres and `genre_num`
474+ ///
475+ /// Examples for `genre_num = 2`
476+ /// - 1 genre: "genre1"
477+ /// - 2 genres: "genre1, genre2"
478+ /// - \>= 3 genres: "genre1, genre2, ..."
479+ fn format_genres ( genres : & [ String ] , genre_num : u8 ) -> String {
480+ let mut genre_str = String :: with_capacity ( 64 ) ;
481+
482+ if genre_num > 0 {
483+ for i in 0 ..genres. len ( ) {
484+ genre_str. push_str ( & genres[ i] ) ;
485+
486+ if i + 1 != genres. len ( ) {
487+ genre_str. push_str ( ", " ) ;
488+
489+ if i + 1 >= genre_num as usize {
490+ genre_str. push_str ( "..." ) ;
491+ break ;
492+ }
493+ }
494+ }
495+ }
496+
497+ genre_str
498+ }
0 commit comments