Skip to content

Commit 7a8ea69

Browse files
authored
Merge pull request #76 from mopidy/mopidy-4.0.0a8
2 parents 5e305c2 + 8850c6c commit 7a8ea69

File tree

7 files changed

+39
-70
lines changed

7 files changed

+39
-70
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ classifiers = [
1414
]
1515
dynamic = ["version"]
1616
dependencies = [
17-
"mopidy >= 4.0.0a7",
17+
"mopidy >= 4.0.0a8",
1818
"pygobject >= 3.50",
1919
"pykka >= 4.1",
2020
]

src/mopidy_mpd/protocol/playback.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
from typing import TYPE_CHECKING, Never
44

5-
from mopidy.core import PlaybackState
6-
from mopidy.types import DurationMs, Percentage
5+
from mopidy.types import DurationMs, Percentage, PlaybackState
76

87
from mopidy_mpd import exceptions, protocol
98

src/mopidy_mpd/protocol/status.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from typing import TYPE_CHECKING
44

5-
from mopidy.core import PlaybackState
5+
from mopidy.types import PlaybackState
66

77
from mopidy_mpd import exceptions, protocol, translator
88

tests/dummy_audio.py

Lines changed: 26 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,23 @@
44
tests of the core and backends.
55
"""
66

7+
from typing import override
8+
79
import pykka
810
from mopidy import audio
11+
from mopidy.types import DurationMs, PlaybackState
912

1013

1114
def create_proxy(config=None, mixer=None):
1215
return DummyAudio.start(config, mixer).proxy()
1316

1417

1518
# TODO: reset position on track change?
16-
class DummyAudio(pykka.ThreadingActor):
19+
class DummyAudio(audio.Audio, pykka.ThreadingActor):
1720
def __init__(self, config=None, mixer=None):
1821
super().__init__()
19-
self.state = audio.PlaybackState.STOPPED
20-
self._volume = 0
21-
self._position = 0
22+
self.state = PlaybackState.STOPPED
23+
self._position = DurationMs(0)
2224
self._source_setup_callback = None
2325
self._about_to_finish_callback = None
2426
self._uri = None
@@ -27,72 +29,60 @@ def __init__(self, config=None, mixer=None):
2729
self._tags = {}
2830
self._bad_uris = set()
2931

32+
@override
3033
def set_uri(self, uri, live_stream=False, download=False):
3134
assert self._uri is None, "prepare change not called before set"
32-
self._position = 0
35+
self._position = DurationMs(0)
3336
self._uri = uri
3437
self._stream_changed = True
3538
self._live_stream = live_stream
3639
self._tags = {}
3740

38-
def set_appsrc(self, *args, **kwargs):
39-
pass
41+
@override
42+
def set_source_setup_callback(self, callback):
43+
self._source_setup_callback = callback
4044

41-
def emit_data(self, buffer_):
42-
pass
45+
@override
46+
def set_about_to_finish_callback(self, callback):
47+
self._about_to_finish_callback = callback
4348

49+
@override
4450
def get_position(self):
4551
return self._position
4652

53+
@override
4754
def set_position(self, position):
4855
self._position = position
4956
audio.AudioListener.send("position_changed", position=position)
5057
return True
5158

59+
@override
5260
def start_playback(self):
53-
return self._change_state(audio.PlaybackState.PLAYING)
61+
return self._change_state(PlaybackState.PLAYING)
5462

63+
@override
5564
def pause_playback(self):
56-
return self._change_state(audio.PlaybackState.PAUSED)
65+
return self._change_state(PlaybackState.PAUSED)
5766

67+
@override
5868
def prepare_change(self):
5969
self._uri = None
6070
self._source_setup_callback = None
6171
return True
6272

73+
@override
6374
def stop_playback(self):
64-
return self._change_state(audio.PlaybackState.STOPPED)
65-
66-
def get_volume(self):
67-
return self._volume
68-
69-
def set_volume(self, volume):
70-
self._volume = volume
71-
return True
72-
73-
def set_metadata(self, track):
74-
pass
75+
return self._change_state(PlaybackState.STOPPED)
7576

77+
@override
7678
def get_current_tags(self):
7779
return self._tags
7880

79-
def set_source_setup_callback(self, callback):
80-
self._source_setup_callback = callback
81-
82-
def set_about_to_finish_callback(self, callback):
83-
self._about_to_finish_callback = callback
84-
85-
def enable_sync_handler(self):
86-
pass
87-
88-
def wait_for_state_change(self):
89-
pass
90-
9181
def _change_state(self, new_state):
9282
if not self._uri:
9383
return False
9484

95-
if new_state == audio.PlaybackState.STOPPED and self._uri:
85+
if new_state == PlaybackState.STOPPED and self._uri:
9686
self._stream_changed = True
9787
self._uri = None
9888

@@ -111,7 +101,7 @@ def _change_state(self, new_state):
111101
target_state=None,
112102
)
113103

114-
if new_state == audio.PlaybackState.PLAYING:
104+
if new_state == PlaybackState.PLAYING:
115105
self._tags["audio-codec"] = ["fake info..."]
116106
audio.AudioListener.send("tags_changed", tags=["audio-codec"])
117107

@@ -123,27 +113,3 @@ def trigger_fake_playback_failure(self, uri):
123113
def trigger_fake_tags_changed(self, tags):
124114
self._tags.update(tags)
125115
audio.AudioListener.send("tags_changed", tags=self._tags.keys())
126-
127-
def get_source_setup_callback(self):
128-
# This needs to be called from outside the actor or we lock up.
129-
def wrapper():
130-
if self._source_setup_callback:
131-
self._source_setup_callback()
132-
133-
return wrapper
134-
135-
def get_about_to_finish_callback(self):
136-
# This needs to be called from outside the actor or we lock up.
137-
def wrapper():
138-
if self._about_to_finish_callback:
139-
self.prepare_change()
140-
self._about_to_finish_callback()
141-
142-
if not self._uri or not self._about_to_finish_callback:
143-
self._tags = {}
144-
audio.AudioListener.send("reached_end_of_stream")
145-
else:
146-
audio.AudioListener.send("position_changed", position=0)
147-
audio.AudioListener.send("stream_changed", uri=self._uri)
148-
149-
return wrapper

tests/protocol/test_playback.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import unittest
22

3-
from mopidy.core import PlaybackState
43
from mopidy.models import Track
4+
from mopidy.types import PlaybackState
55

66
from tests import protocol
77

tests/protocol/test_regression.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ class IssueGH17RegressionTest(protocol.BaseTestCase):
2222
- Press next until you get to the unplayable track
2323
"""
2424

25-
@mock.patch.object(protocol.core.tracklist.random, "shuffle", mock_shuffle)
2625
def test(self):
26+
random.seed(1)
2727
tracks = [
2828
Track(uri="dummy:a"),
2929
Track(uri="dummy:b"),
@@ -42,14 +42,18 @@ def test(self):
4242
assert self.core.playback.get_current_track().get().uri == "dummy:a"
4343
self.send_request('random "1"')
4444
self.send_request("next")
45-
assert self.core.playback.get_current_track().get().uri == "dummy:b"
45+
assert self.core.playback.get_current_track().get().uri == "dummy:d"
4646
self.send_request("next")
47-
# Should now be at track 'c', but playback fails and it skips ahead
4847
assert self.core.playback.get_current_track().get().uri == "dummy:f"
4948
self.send_request("next")
50-
assert self.core.playback.get_current_track().get().uri == "dummy:d"
49+
assert self.core.playback.get_current_track().get().uri == "dummy:a"
5150
self.send_request("next")
5251
assert self.core.playback.get_current_track().get().uri == "dummy:e"
52+
self.send_request("next")
53+
assert self.core.playback.get_current_track().get().uri == "dummy:b"
54+
self.send_request("next")
55+
# All tracks have been played, including the error one, which we skipped.
56+
assert self.core.playback.get_current_track().get() is None
5357

5458

5559
class IssueGH18RegressionTest(protocol.BaseTestCase):

tests/test_status.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
import pykka
55
from mopidy import core
6-
from mopidy.core import PlaybackState
76
from mopidy.models import Track
7+
from mopidy.types import PlaybackState
88

99
from mopidy_mpd import dispatcher, uri_mapper
1010
from mopidy_mpd.protocol import status

0 commit comments

Comments
 (0)