Skip to content

Commit eba8f2c

Browse files
authored
Merge pull request #140 from DakaraProject/refactor/instrumental-tracks
Improve management of instrumental tracks
2 parents 15a2d3d + 28e43b8 commit eba8f2c

File tree

4 files changed

+51
-45
lines changed

4 files changed

+51
-45
lines changed

src/dakara_player/media_player/mpv.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040

4141
PLAYER_IS_AVAILABLE_ATTEMPTS = 5
4242

43+
USE_PATH_AUDIO = -1
44+
4345

4446
# monkey patch mpv to silent socket close failures on windows
4547
if mpv is not None:
@@ -395,18 +397,17 @@ def play(self, what):
395397

396398
if what == "song":
397399
# manage instrumental track/file
398-
path_audio = self.playlist_entry_data["song"].path_audio
399-
if path_audio:
400-
if path_audio == "self":
401-
# mpv use different index for each track, so we can safely request
402-
# the second audio track
403-
self.player.audio = 2
404-
logger.debug("Requesting to play audio track 2")
405-
406-
else:
400+
track_id_audio = self.playlist_entry_data["song"].track_id_audio
401+
if track_id_audio is not None:
402+
if track_id_audio == USE_PATH_AUDIO:
403+
path_audio = self.playlist_entry_data["song"].path_audio
407404
self.player.audio_files = [str(path_audio)]
408405
logger.debug("Requesting to play audio file %s", path_audio)
409406

407+
else:
408+
self.player.audio = track_id_audio
409+
logger.debug("Requesting to play audio track %i", track_id_audio)
410+
410411
# if the subtitle file cannot be discovered, do not request it
411412
if self.playlist_entry_data["song"].path_subtitle:
412413
self.player.sub_files = [
@@ -581,6 +582,7 @@ def manage_instrumental(self, playlist_entry, file_path):
581582
audio_path = self.get_instrumental_file(file_path)
582583

583584
if audio_path:
585+
self.playlist_entry_data["song"].track_id_audio = USE_PATH_AUDIO
584586
self.playlist_entry_data["song"].path_audio = audio_path
585587
logger.info(
586588
"Requesting to play instrumental file '%s' for '%s'",
@@ -590,9 +592,10 @@ def manage_instrumental(self, playlist_entry, file_path):
590592

591593
return
592594

593-
# otherwise mark to look for instrumental track in internal tracks when
594-
# starting to read the media
595-
self.playlist_entry_data["song"].path_audio = "self"
595+
# otherwise mark to use the 2nd track when starting to read the media
596+
# mpv use different index for each track, so we can safely request the
597+
# second audio track
598+
self.playlist_entry_data["song"].track_id_audio = 2
596599
logger.info("Requesting to play instrumental track of '%s'", file_path)
597600

598601
def clear_playlist_entry_player(self):
@@ -723,7 +726,7 @@ def handle_start_file(self, event):
723726

724727
raise InvalidStateError("Start file on an undeterminated state")
725728

726-
def get_audio_tracks_id(self):
729+
def get_track_id_audio_list(self):
727730
"""Get ID of audio tracks for the current media.
728731
729732
Returns:
@@ -1034,10 +1037,13 @@ def __init__(self, path=None):
10341037
class MediaSong(Media):
10351038
"""Song class."""
10361039

1037-
def __init__(self, *args, path_subtitle=None, path_audio=None, **kwargs):
1040+
def __init__(
1041+
self, *args, path_subtitle=None, path_audio=None, track_id_audio=None, **kwargs
1042+
):
10381043
super().__init__(*args, **kwargs)
10391044
self.path_subtitle = path_subtitle
10401045
self.path_audio = path_audio
1046+
self.track_id_audio = track_id_audio
10411047

10421048

10431049
class MpvTooOldError(DakaraError):

src/dakara_player/media_player/vlc.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -500,18 +500,18 @@ def manage_instrumental(self, playlist_entry, file_path):
500500
)
501501
return
502502

503-
self.playlist_entry_data["song"].audio_track_id = number_tracks
503+
self.playlist_entry_data["song"].track_id_audio = number_tracks
504504
return
505505

506-
# get audio tracks
507-
audio_tracks_id = self.get_audio_tracks_id(
506+
# get audio track ids
507+
track_id_audio_list = self.get_track_id_audio_list(
508508
self.playlist_entry_data["song"].media
509509
)
510510

511511
# if more than 1 audio track is present, register to play the 2nd one
512-
if len(audio_tracks_id) > 1:
512+
if len(track_id_audio_list) > 1:
513513
logger.info("Requesting to play instrumental track of '%s'", file_path)
514-
self.playlist_entry_data["song"].audio_track_id = audio_tracks_id[1]
514+
self.playlist_entry_data["song"].track_id_audio = track_id_audio_list[1]
515515
return
516516

517517
# otherwise, fallback to register to play the first track and log it
@@ -539,7 +539,7 @@ def get_number_tracks(media):
539539
return len(list(media.tracks_get()))
540540

541541
@staticmethod
542-
def get_audio_tracks_id(media):
542+
def get_track_id_audio_list(media):
543543
"""Get ID of audio tracks of the media.
544544
545545
Args:
@@ -681,10 +681,10 @@ def handle_playing(self, event):
681681
self.callbacks["started_song"](self.playlist_entry["id"])
682682

683683
# set instrumental track if necessary
684-
audio_track_id = self.playlist_entry_data["song"].audio_track_id
685-
if audio_track_id is not None:
686-
logger.debug("Requesting to play audio track %i", audio_track_id)
687-
self.player.audio_set_track(audio_track_id)
684+
track_id_audio = self.playlist_entry_data["song"].track_id_audio
685+
if track_id_audio is not None:
686+
logger.debug("Requesting to play audio track %i", track_id_audio)
687+
self.player.audio_set_track(track_id_audio)
688688

689689
self.playlist_entry_data["song"].started = True
690690
logger.info(
@@ -803,9 +803,9 @@ def __init__(self, media=None):
803803
class MediaSong(Media):
804804
"""Song object."""
805805

806-
def __init__(self, *args, audio_track_id=None, **kwargs):
806+
def __init__(self, *args, track_id_audio=None, **kwargs):
807807
super().__init__(*args, **kwargs)
808-
self.audio_track_id = audio_track_id
808+
self.track_id_audio = track_id_audio
809809

810810

811811
class VlcTooOldError(DakaraError):

tests/integration/test_media_player_mpv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def test_play_playlist_entry_instrumental_track(self):
245245
self.wait_is_playing(mpv_player, "song")
246246

247247
# check the current media has 2 audio tracks
248-
self.assertListEqual(mpv_player.get_audio_tracks_id(), [1, 2])
248+
self.assertListEqual(mpv_player.get_track_id_audio_list(), [1, 2])
249249

250250
# check media exists
251251
self.assertIsNotNone(mpv_player.player.path)

tests/unit/test_media_player_vlc.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -475,22 +475,22 @@ def test_set_playlist_entry(
475475
mocked_play.assert_called_with("transition")
476476
mocked_manage_instrumental.assert_not_called()
477477

478-
@patch.object(MediaPlayerVlc, "get_audio_tracks_id")
478+
@patch.object(MediaPlayerVlc, "get_track_id_audio_list")
479479
@patch.object(MediaPlayerVlc, "get_number_tracks")
480480
@patch.object(MediaPlayerVlc, "get_instrumental_file")
481481
def test_manage_instrumental_file(
482482
self,
483483
mocked_get_instrumental_file,
484484
mocked_get_number_tracks,
485-
mocked_get_audio_tracks_id,
485+
mocked_get_track_id_audio_list,
486486
):
487487
"""Test to add instrumental file."""
488488
with self.get_instance() as (vlc_player, (mocked_instance, _, _), _):
489489
video_path = get_temp_dir() / "video"
490490
audio_path = get_temp_dir() / "audio"
491491

492492
# pre assertions
493-
self.assertIsNone(vlc_player.playlist_entry_data["song"].audio_track_id)
493+
self.assertIsNone(vlc_player.playlist_entry_data["song"].track_id_audio)
494494
self.assertIsNotNone(vlc_player.kara_folder_path)
495495

496496
# set playlist entry to request instrumental
@@ -507,7 +507,7 @@ def test_manage_instrumental_file(
507507
vlc_player.manage_instrumental(self.playlist_entry, video_path)
508508

509509
# post assertions
510-
self.assertEqual(vlc_player.playlist_entry_data["song"].audio_track_id, 2)
510+
self.assertEqual(vlc_player.playlist_entry_data["song"].track_id_audio, 2)
511511

512512
# assert the effects on logs
513513
self.assertListEqual(
@@ -519,7 +519,7 @@ def test_manage_instrumental_file(
519519
)
520520

521521
# assert the call
522-
mocked_get_audio_tracks_id.assert_not_called()
522+
mocked_get_track_id_audio_list.assert_not_called()
523523

524524
@patch.object(MediaPlayerVlc, "get_number_tracks")
525525
@patch.object(MediaPlayerVlc, "get_instrumental_file")
@@ -534,7 +534,7 @@ def test_manage_instrumental_file_error_slaves_add(
534534
audio_path = get_temp_dir() / "audio"
535535

536536
# pre assertions
537-
self.assertIsNone(vlc_player.playlist_entry_data["song"].audio_track_id)
537+
self.assertIsNone(vlc_player.playlist_entry_data["song"].track_id_audio)
538538
self.assertIsNotNone(vlc_player.kara_folder_path)
539539

540540
# set playlist entry to request instrumental
@@ -554,7 +554,7 @@ def test_manage_instrumental_file_error_slaves_add(
554554
vlc_player.manage_instrumental(self.playlist_entry, video_path)
555555

556556
# post assertions
557-
self.assertIsNone(vlc_player.playlist_entry_data["song"].audio_track_id)
557+
self.assertIsNone(vlc_player.playlist_entry_data["song"].track_id_audio)
558558

559559
# assert the effects on logs
560560
self.assertListEqual(
@@ -567,14 +567,14 @@ def test_manage_instrumental_file_error_slaves_add(
567567
],
568568
)
569569

570-
@patch.object(MediaPlayerVlc, "get_audio_tracks_id")
570+
@patch.object(MediaPlayerVlc, "get_track_id_audio_list")
571571
@patch.object(MediaPlayerVlc, "get_number_tracks")
572572
@patch.object(MediaPlayerVlc, "get_instrumental_file")
573573
def test_manage_instrumental_track(
574574
self,
575575
mocked_get_instrumental_file,
576576
mocked_get_number_tracks,
577-
mocked_get_audio_tracks_id,
577+
mocked_get_track_id_audio_list,
578578
):
579579
"""Test add instrumental track."""
580580
with self.get_instance() as (
@@ -589,15 +589,15 @@ def test_manage_instrumental_track(
589589
video_path = get_temp_dir() / "video"
590590

591591
# pre assertions
592-
self.assertIsNone(vlc_player.playlist_entry_data["song"].audio_track_id)
592+
self.assertIsNone(vlc_player.playlist_entry_data["song"].track_id_audio)
593593
self.assertIsNotNone(vlc_player.kara_folder_path)
594594

595595
# set playlist entry to request instrumental
596596
self.playlist_entry["use_instrumental"] = True
597597

598598
# mocks
599599
mocked_get_instrumental_file.return_value = None
600-
mocked_get_audio_tracks_id.return_value = [0, 99, 42]
600+
mocked_get_track_id_audio_list.return_value = [0, 99, 42]
601601
mocked_media_song = mocked_instance.media_new_path.return_value
602602
vlc_player.playlist_entry_data["song"].media = mocked_media_song
603603

@@ -606,7 +606,7 @@ def test_manage_instrumental_track(
606606
vlc_player.manage_instrumental(self.playlist_entry, video_path)
607607

608608
# post assertions
609-
self.assertEqual(vlc_player.playlist_entry_data["song"].audio_track_id, 99)
609+
self.assertEqual(vlc_player.playlist_entry_data["song"].track_id_audio, 99)
610610

611611
# assert the effects on logs
612612
self.assertListEqual(
@@ -620,24 +620,24 @@ def test_manage_instrumental_track(
620620
# assert the call
621621
mocked_get_number_tracks.assert_not_called()
622622

623-
@patch.object(MediaPlayerVlc, "get_audio_tracks_id")
623+
@patch.object(MediaPlayerVlc, "get_track_id_audio_list")
624624
@patch.object(MediaPlayerVlc, "get_instrumental_file")
625625
def test_manage_instrumental_no_instrumental_found(
626-
self, mocked_get_instrumental_file, mocked_get_audio_tracks_id
626+
self, mocked_get_instrumental_file, mocked_get_track_id_audio_list
627627
):
628628
"""Test to cannot find instrumental."""
629629
with self.get_instance() as (vlc_player, (mocked_instance, _, _), _):
630630
video_path = get_temp_dir() / "video"
631631

632632
# pre assertions
633-
self.assertIsNone(vlc_player.playlist_entry_data["song"].audio_track_id)
633+
self.assertIsNone(vlc_player.playlist_entry_data["song"].track_id_audio)
634634

635635
# set playlist entry to request instrumental
636636
self.playlist_entry["use_instrumental"] = True
637637

638638
# mocks
639639
mocked_get_instrumental_file.return_value = None
640-
mocked_get_audio_tracks_id.return_value = [99]
640+
mocked_get_track_id_audio_list.return_value = [99]
641641

642642
# make slaves_add method unavailable
643643
mocked_media_song = mocked_instance.return_value.media_new_path.return_value
@@ -648,7 +648,7 @@ def test_manage_instrumental_no_instrumental_found(
648648
vlc_player.manage_instrumental(self.playlist_entry, video_path)
649649

650650
# post assertions
651-
self.assertIsNone(vlc_player.playlist_entry_data["song"].audio_track_id)
651+
self.assertIsNone(vlc_player.playlist_entry_data["song"].track_id_audio)
652652

653653
# assert the effects on logs
654654
self.assertListEqual(
@@ -1009,7 +1009,7 @@ def test_handle_playing_media_starts_track_id(self, mocked_is_playing_this):
10091009
with self.get_instance() as (vlc_player, (mocked_instance, _, _), _):
10101010
mocked_player = mocked_instance.media_player_new.return_value
10111011
self.set_playlist_entry(vlc_player)
1012-
vlc_player.playlist_entry_data["song"].audio_track_id = 99
1012+
vlc_player.playlist_entry_data["song"].track_id_audio = 99
10131013

10141014
# mock the call
10151015
vlc_player.set_callback("started_song", MagicMock())

0 commit comments

Comments
 (0)