|
39 | 39 | CLIENT_ID_RU_DECLINED = '1269826362399522849' #Яндекс Музыку (склонение для активности "Слушает") |
40 | 40 |
|
41 | 41 | # Версия (tag) скрипта для проверки на актуальность через Github Releases |
42 | | -CURRENT_VERSION = "v0.2" |
| 42 | +CURRENT_VERSION = "v0.2.1" |
43 | 43 |
|
44 | 44 | # Ссылка на репозиторий |
45 | 45 | REPO_URL = "https://github.com/FozerG/YandexMusicRPC" |
@@ -354,99 +354,114 @@ def start() -> None: |
354 | 354 | Presence.discord_available() |
355 | 355 | Presence.running = True |
356 | 356 | Presence.currentTrack = None |
| 357 | + |
357 | 358 | while Presence.running: |
358 | 359 | if not Presence.client: |
359 | 360 | if not clientErrorShown: |
360 | 361 | log("To work, you need to log in to your Yandex account. Tray -> Yandex Settings -> Login to account.", LogType.Error) |
361 | 362 | clientErrorShown = True |
362 | 363 | time.sleep(3) |
363 | 364 | continue |
| 365 | + |
364 | 366 | currentTime = time.time() |
365 | 367 | if not Presence.is_discord_running(): |
366 | | - Presence.discord_was_closed() |
| 368 | + Presence.discord_was_closed() |
367 | 369 | if needRestart: |
368 | 370 | needRestart = False |
369 | 371 | Presence.restart() |
| 372 | + |
370 | 373 | try: |
371 | 374 | ongoing_track = Presence.getTrack() |
372 | | - if Presence.currentTrack != ongoing_track: # проверяем что песня не играла до этого, т.к она просто может быть снята с паузы. |
373 | | - if ongoing_track['success']: |
374 | | - if Presence.currentTrack is not None and 'label' in Presence.currentTrack and Presence.currentTrack['label'] is not None: |
375 | | - if ongoing_track['label'] != Presence.currentTrack['label']: |
376 | | - log(f"Changed track to {ongoing_track['label']}", LogType.Update_Status) |
377 | | - else: |
378 | | - log(f"Changed track to {ongoing_track['label']}", LogType.Update_Status) |
| 375 | + if ongoing_track['success']: |
| 376 | + is_new_track = ( |
| 377 | + Presence.currentTrack is None or |
| 378 | + Presence.currentTrack.get('label') != ongoing_track.get('label') |
| 379 | + ) |
| 380 | + is_start_time_changed = ( |
| 381 | + Presence.currentTrack and |
| 382 | + Presence.currentTrack.get('start-time') != ongoing_track.get('start-time') |
| 383 | + ) |
| 384 | + is_paused = ongoing_track["playback"] != PlaybackStatus.Playing |
| 385 | + is_playing = not is_paused |
| 386 | + |
| 387 | + if is_new_track: |
| 388 | + log(f"Changed track to {ongoing_track['label']}", LogType.Update_Status) |
| 389 | + Presence.update_presence(ongoing_track, currentTime) |
| 390 | + Presence.currentTrack = ongoing_track |
| 391 | + Presence.paused = False |
379 | 392 | Presence.paused_time = 0 |
380 | | - trackTime = currentTime |
381 | | - start_time = currentTime - int(ongoing_track['start-time'].total_seconds()) |
382 | | - end_time = start_time + ongoing_track['durationSec'] |
383 | | - presence_args = { |
384 | | - 'activity_type': 2, |
385 | | - 'details': ongoing_track['title'], |
386 | | - 'state': ongoing_track['artist'], |
387 | | - 'start': start_time, |
388 | | - 'end': end_time, |
389 | | - 'large_image': ongoing_track['og-image'], |
390 | | - } |
391 | | - |
392 | | - if ongoing_track['album'] != ongoing_track['title']: |
393 | | - presence_args['large_text'] = ongoing_track['album'] |
394 | | - |
395 | | - if button_config != ButtonConfig.NEITHER: |
396 | | - presence_args['buttons'] = build_buttons(ongoing_track['link']) |
397 | 393 |
|
398 | | - presence_args['small_image'] = "https://github.com/FozerG/YandexMusicRPC/blob/main/assets/Playing.png?raw=true" |
399 | | - presence_args['small_text'] = "Playing" if language_config == LanguageConfig.ENGLISH else "Проигрывается" |
400 | | - Presence.rpc.update(**presence_args) |
401 | | - else: |
402 | | - Presence.rpc.clear() |
403 | | - log(f"Clear RPC") |
404 | | - |
405 | | - Presence.currentTrack = ongoing_track |
| 394 | + elif is_start_time_changed and not Presence.paused: |
| 395 | + Presence.update_presence(ongoing_track, currentTime) |
| 396 | + Presence.currentTrack = ongoing_track |
| 397 | + Presence.paused = False |
| 398 | + Presence.paused_time = 0 |
406 | 399 |
|
407 | | - else: #Песня не новая, проверяем статус паузы |
408 | | - if ongoing_track['success'] and ongoing_track["playback"] != PlaybackStatus.Playing and not Presence.paused: |
409 | | - Presence.paused = True |
| 400 | + elif is_paused and not Presence.paused: |
410 | 401 | log(f"Track {ongoing_track['label']} on pause", LogType.Update_Status) |
411 | | - if ongoing_track['success']: |
412 | | - presence_args = { |
413 | | - 'activity_type': 2, |
414 | | - 'details': ongoing_track['title'], |
415 | | - 'state': ongoing_track['artist'], |
416 | | - 'large_image': ongoing_track['og-image'], |
417 | | - 'large_text': ongoing_track['album'], |
418 | | - 'small_image': "https://github.com/FozerG/YandexMusicRPC/blob/main/assets/Paused.png?raw=true", |
419 | | - 'small_text': "On pause" if language_config == LanguageConfig.ENGLISH else "На паузе" |
420 | | - } |
421 | | - if button_config != ButtonConfig.NEITHER: |
422 | | - presence_args['buttons'] = build_buttons(ongoing_track['link']) |
423 | | - |
424 | | - presence_args['large_text'] = f"{'On pause' if language_config == LanguageConfig.ENGLISH else 'На паузе'} {format_duration(int(ongoing_track['start-time'].total_seconds() * 1000))} / {ongoing_track['formatted_duration']}" |
425 | | - |
426 | | - if int(ongoing_track['start-time'].total_seconds()) != 0: |
427 | | - presence_args['small_text'] = f"{'On pause' if language_config == LanguageConfig.ENGLISH else 'На паузе'} {format_duration(int(ongoing_track['start-time'].total_seconds() * 1000))} / {ongoing_track['formatted_duration']}" |
428 | | - |
429 | | - Presence.rpc.update(**presence_args) |
| 402 | + Presence.update_presence(ongoing_track, paused=True) |
| 403 | + Presence.paused = True |
| 404 | + trackTime = 0 # сброс времени трека |
430 | 405 |
|
431 | | - elif ongoing_track['success'] and ongoing_track["playback"] == PlaybackStatus.Playing and Presence.paused: |
| 406 | + elif is_playing and Presence.paused: |
432 | 407 | log(f"Track {ongoing_track['label']} off pause.", LogType.Update_Status) |
| 408 | + Presence.update_presence(ongoing_track, currentTime) |
433 | 409 | Presence.paused = False |
| 410 | + Presence.currentTrack = ongoing_track |
434 | 411 |
|
435 | | - elif ongoing_track['success'] and ongoing_track["playback"] != PlaybackStatus.Playing and Presence.paused and trackTime != 0: |
| 412 | + if Presence.paused and trackTime != 0: |
436 | 413 | Presence.paused_time = currentTime - trackTime |
437 | | - if Presence.paused_time > 5 * 60: # если пауза больше 5 минут |
| 414 | + if Presence.paused_time > 5 * 60: # Если пауза больше 5 минут |
438 | 415 | trackTime = 0 |
439 | 416 | Presence.rpc.clear() |
440 | 417 | log(f"Clear RPC due to paused for more than 5 minutes", LogType.Update_Status) |
441 | 418 | else: |
442 | | - Presence.paused_time = 0 # если трек продолжает играть, сбрасываем paused_time |
443 | | - |
| 419 | + Presence.paused_time = 0 |
| 420 | + else: |
| 421 | + Presence.rpc.clear() |
| 422 | + log(f"Clear RPC by error") |
444 | 423 | time.sleep(3) |
445 | 424 | except pypresence.exceptions.PipeClosed: |
446 | | - Presence.discord_was_closed() |
| 425 | + Presence.discord_was_closed() |
447 | 426 | except Exception as e: |
448 | 427 | log(f"Presence class stopped for a reason: {e}", LogType.Error) |
449 | 428 |
|
| 429 | + @staticmethod |
| 430 | + def update_presence(ongoing_track, current_time=0, paused=False): |
| 431 | + start_time = current_time - int(ongoing_track['start-time'].total_seconds()) |
| 432 | + end_time = start_time + ongoing_track['durationSec'] |
| 433 | + |
| 434 | + if language_config == LanguageConfig.RUSSIAN: |
| 435 | + playing_text = "Проигрывается" |
| 436 | + paused_text = "На паузе" |
| 437 | + else: |
| 438 | + playing_text = "Playing" |
| 439 | + paused_text = "On pause" |
| 440 | + |
| 441 | + presence_args = { |
| 442 | + 'activity_type': 2, |
| 443 | + 'details': ongoing_track['title'], |
| 444 | + 'state': ongoing_track['artist'], |
| 445 | + 'large_image': ongoing_track['og-image'], |
| 446 | + 'small_image': "https://github.com/FozerG/YandexMusicRPC/blob/main/assets/Paused.png?raw=true" if paused else "https://github.com/FozerG/YandexMusicRPC/blob/main/assets/Playing.png?raw=true", |
| 447 | + 'small_text': paused_text if paused else playing_text |
| 448 | + } |
| 449 | + |
| 450 | + if ongoing_track['album'] != ongoing_track['title']: |
| 451 | + presence_args['large_text'] = ongoing_track['album'] |
| 452 | + |
| 453 | + if paused: |
| 454 | + presence_args['large_text'] = f"{paused_text} {format_duration(int(ongoing_track['start-time'].total_seconds() * 1000))} / {ongoing_track['formatted_duration']}" |
| 455 | + else: |
| 456 | + presence_args['start'] = start_time |
| 457 | + presence_args['end'] = end_time |
| 458 | + |
| 459 | + if button_config != ButtonConfig.NEITHER: |
| 460 | + presence_args['buttons'] = build_buttons(ongoing_track['link']) |
| 461 | + |
| 462 | + Presence.rpc.update(**presence_args) |
| 463 | + |
| 464 | + |
450 | 465 | # Метод для получения информации о текущем треке. |
451 | 466 | @staticmethod |
452 | 467 | def getTrack() -> dict: |
|
0 commit comments