@@ -3,7 +3,9 @@ use std::sync::{LazyLock, Mutex};
33use std:: thread;
44use std:: time:: { Duration , SystemTime , UNIX_EPOCH } ;
55
6- use discord_rich_presence:: activity:: { Activity , ActivityType , Assets , Button , Timestamps } ;
6+ use discord_rich_presence:: activity:: {
7+ Activity , ActivityType , Assets , Button , StatusDisplayType , Timestamps ,
8+ } ;
79use discord_rich_presence:: { DiscordIpc , DiscordIpcClient } ;
810use tracing:: { debug, info, warn} ;
911
@@ -36,24 +38,29 @@ struct ActivityData {
3638 current_time : f64 ,
3739 cached_cover_url : String ,
3840 cached_song_url : String ,
41+ /// 缓存 "歌曲名 - 歌手" 格式的完整信息
42+ cached_full_info : String ,
3943}
4044
4145impl ActivityData {
4246 fn from_metadata ( metadata : MetadataPayload ) -> Self {
4347 let cached_cover_url = Self :: process_cover_url ( metadata. original_cover_url . as_deref ( ) ) ;
4448 let cached_song_url = Self :: process_song_url ( metadata. ncm_id ) ;
49+ let cached_full_info = format ! ( "{} - {}" , metadata. song_name, metadata. author_name) ;
4550 Self {
4651 metadata,
4752 status : PlaybackStatus :: Paused ,
4853 current_time : 0.0 ,
4954 cached_cover_url,
5055 cached_song_url,
56+ cached_full_info,
5157 }
5258 }
5359
5460 fn update_metadata ( & mut self , metadata : MetadataPayload ) {
5561 self . cached_cover_url = Self :: process_cover_url ( metadata. original_cover_url . as_deref ( ) ) ;
5662 self . cached_song_url = Self :: process_song_url ( metadata. ncm_id ) ;
63+ self . cached_full_info = format ! ( "{} - {}" , metadata. song_name, metadata. author_name) ;
5764 self . metadata = metadata;
5865 self . current_time = 0.0 ;
5966 }
@@ -110,7 +117,7 @@ impl Default for RpcWorker {
110117 connect_retry_count : 0 ,
111118 last_sent_end_timestamp : None ,
112119 show_when_paused : false ,
113- display_mode : DiscordDisplayMode :: Details ,
120+ display_mode : DiscordDisplayMode :: Name ,
114121 }
115122 }
116123}
@@ -182,20 +189,15 @@ impl RpcWorker {
182189 return ;
183190 }
184191
185- match DiscordIpcClient :: new ( APP_ID ) {
186- Ok ( mut client) => match client. connect ( ) {
187- Ok ( ( ) ) => {
188- info ! ( "Discord IPC 已连接" ) ;
189- self . client = Some ( client) ;
190- self . last_sent_end_timestamp = None ;
191- }
192- Err ( e) => {
193- info ! ( "连接 Discord IPC 失败: {e:?}. Discord 可能未运行" ) ;
194- self . connect_retry_count = RECONNECT_COOLDOWN_SECONDS ;
195- }
196- } ,
192+ let mut client = DiscordIpcClient :: new ( APP_ID ) ;
193+ match client. connect ( ) {
194+ Ok ( ( ) ) => {
195+ info ! ( "Discord IPC 已连接" ) ;
196+ self . client = Some ( client) ;
197+ self . last_sent_end_timestamp = None ;
198+ }
197199 Err ( e) => {
198- info ! ( "创建 Discord IPC 客户端失败 : {e:?}" ) ;
200+ info ! ( "连接 Discord IPC 失败 : {e:?}. Discord 可能未运行 " ) ;
199201 self . connect_retry_count = RECONNECT_COOLDOWN_SECONDS ;
200202 }
201203 }
@@ -244,30 +246,42 @@ impl RpcWorker {
244246
245247 let buttons = vec ! [ Button :: new( "🎧 Listen" , & data. cached_song_url) ] ;
246248
247- let mut activity = Activity :: new ( )
248- . activity_type ( ActivityType :: Listening )
249- . assets ( assets)
250- . buttons ( buttons) ;
251-
252- // 根据显示模式设置 details 和 state
253- activity = match display_mode {
249+ // 根据显示模式设置左下角 "正在听 - XXX" 的显示内容
250+ // StatusDisplayType::Name -> 显示应用名称 (SPlayer)
251+ // StatusDisplayType::Details -> 显示 details 字段
252+ // StatusDisplayType::State -> 显示 state 字段
253+ match display_mode {
254254 DiscordDisplayMode :: Name => {
255- // 显示为 "Listening to SPlayer"
256- activity. details ( "SPlayer" )
255+ // 仅歌曲名:左下角显示歌曲名
256+ Activity :: new ( )
257+ . details ( & data. metadata . song_name )
258+ . state ( & data. metadata . author_name )
259+ . activity_type ( ActivityType :: Listening )
260+ . assets ( assets)
261+ . buttons ( buttons)
262+ . status_display_type ( StatusDisplayType :: Details )
257263 }
258264 DiscordDisplayMode :: State => {
259- // 显示为 "Listening to {artist}"
260- activity. details ( & data. metadata . author_name )
265+ // 仅播放状态:左下角显示 SPlayer
266+ Activity :: new ( )
267+ . details ( & data. metadata . song_name )
268+ . state ( & data. metadata . author_name )
269+ . activity_type ( ActivityType :: Listening )
270+ . assets ( assets)
271+ . buttons ( buttons)
272+ . status_display_type ( StatusDisplayType :: Name )
261273 }
262274 DiscordDisplayMode :: Details => {
263- // 显示为 "Listening to {song}" - by {artist}
264- activity
265- . details ( & data. metadata . song_name )
275+ // 完整信息:左下角显示 "歌曲名 - 歌手"
276+ Activity :: new ( )
277+ . details ( & data. cached_full_info )
266278 . state ( & data. metadata . author_name )
279+ . activity_type ( ActivityType :: Listening )
280+ . assets ( assets)
281+ . buttons ( buttons)
282+ . status_display_type ( StatusDisplayType :: Details )
267283 }
268- } ;
269-
270- activity
284+ }
271285 }
272286
273287 fn calc_paused_timestamps ( current_time : f64 , duration : f64 ) -> ( i64 , i64 ) {
0 commit comments