Skip to content

Commit

Permalink
Format with Black
Browse files Browse the repository at this point in the history
  • Loading branch information
jodal committed Nov 16, 2019
1 parent 339538e commit 0499807
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 86 deletions.
15 changes: 8 additions & 7 deletions mopidy_scrobbler/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,26 @@
from mopidy import config, ext


__version__ = '1.2.1'
__version__ = "1.2.1"


class Extension(ext.Extension):

dist_name = 'Mopidy-Scrobbler'
ext_name = 'scrobbler'
dist_name = "Mopidy-Scrobbler"
ext_name = "scrobbler"
version = __version__

def get_default_config(self):
conf_file = os.path.join(os.path.dirname(__file__), 'ext.conf')
conf_file = os.path.join(os.path.dirname(__file__), "ext.conf")
return config.read(conf_file)

def get_config_schema(self):
schema = super().get_config_schema()
schema['username'] = config.String()
schema['password'] = config.Secret()
schema["username"] = config.String()
schema["password"] = config.Secret()
return schema

def setup(self, registry):
from .frontend import ScrobblerFrontend
registry.add('frontend', ScrobblerFrontend)

registry.add("frontend", ScrobblerFrontend)
53 changes: 31 additions & 22 deletions mopidy_scrobbler/frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,17 @@

logger = logging.getLogger(__name__)

API_KEY = '2236babefa8ebb3d93ea467560d00d04'
API_SECRET = '94d9a09c0cd5be955c4afaeaffcaefcd'
API_KEY = "2236babefa8ebb3d93ea467560d00d04"
API_SECRET = "94d9a09c0cd5be955c4afaeaffcaefcd"

PYLAST_ERRORS = tuple(
getattr(pylast, exc_name)
for exc_name in (
'ScrobblingError', 'NetworkError', 'MalformedResponseError', 'WSError')
"ScrobblingError",
"NetworkError",
"MalformedResponseError",
"WSError",
)
if hasattr(pylast, exc_name)
)

Expand All @@ -31,54 +35,59 @@ def __init__(self, config, core):
def on_start(self):
try:
self.lastfm = pylast.LastFMNetwork(
api_key=API_KEY, api_secret=API_SECRET,
username=self.config['scrobbler']['username'],
password_hash=pylast.md5(self.config['scrobbler']['password']))
logger.info('Scrobbler connected to Last.fm')
api_key=API_KEY,
api_secret=API_SECRET,
username=self.config["scrobbler"]["username"],
password_hash=pylast.md5(self.config["scrobbler"]["password"]),
)
logger.info("Scrobbler connected to Last.fm")
except PYLAST_ERRORS as e:
logger.error('Error during Last.fm setup: %s', e)
logger.error("Error during Last.fm setup: %s", e)
self.stop()

def track_playback_started(self, tl_track):
track = tl_track.track
artists = ', '.join(sorted([a.name for a in track.artists]))
artists = ", ".join(sorted([a.name for a in track.artists]))
duration = track.length and track.length // 1000 or 0
self.last_start_time = int(time.time())
logger.debug('Now playing track: %s - %s', artists, track.name)
logger.debug("Now playing track: %s - %s", artists, track.name)
try:
self.lastfm.update_now_playing(
artists,
(track.name or ''),
album=(track.album and track.album.name or ''),
(track.name or ""),
album=(track.album and track.album.name or ""),
duration=str(duration),
track_number=str(track.track_no or 0),
mbid=(track.musicbrainz_id or ''))
mbid=(track.musicbrainz_id or ""),
)
except PYLAST_ERRORS as e:
logger.warning('Error submitting playing track to Last.fm: %s', e)
logger.warning("Error submitting playing track to Last.fm: %s", e)

def track_playback_ended(self, tl_track, time_position):
track = tl_track.track
artists = ', '.join(sorted([a.name for a in track.artists]))
artists = ", ".join(sorted([a.name for a in track.artists]))
duration = track.length and track.length // 1000 or 0
time_position = time_position // 1000
if duration < 30:
logger.debug('Track too short to scrobble. (30s)')
logger.debug("Track too short to scrobble. (30s)")
return
if time_position < duration // 2 and time_position < 240:
logger.debug(
'Track not played long enough to scrobble. (50% or 240s)')
"Track not played long enough to scrobble. (50% or 240s)"
)
return
if self.last_start_time is None:
self.last_start_time = int(time.time()) - duration
logger.debug('Scrobbling track: %s - %s', artists, track.name)
logger.debug("Scrobbling track: %s - %s", artists, track.name)
try:
self.lastfm.scrobble(
artists,
(track.name or ''),
(track.name or ""),
str(self.last_start_time),
album=(track.album and track.album.name or ''),
album=(track.album and track.album.name or ""),
track_number=str(track.track_no or 0),
duration=str(duration),
mbid=(track.musicbrainz_id or ''))
mbid=(track.musicbrainz_id or ""),
)
except PYLAST_ERRORS as e:
logger.warning('Error submitting played track to Last.fm: %s', e)
logger.warning("Error submitting played track to Last.fm: %s", e)
16 changes: 8 additions & 8 deletions tests/test_extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,23 @@


class ExtensionTest(unittest.TestCase):

def test_get_default_config(self):
ext = Extension()

config = ext.get_default_config()

self.assertIn('[scrobbler]', config)
self.assertIn('enabled = true', config)
self.assertIn('username =', config)
self.assertIn('password =', config)
self.assertIn("[scrobbler]", config)
self.assertIn("enabled = true", config)
self.assertIn("username =", config)
self.assertIn("password =", config)

def test_get_config_schema(self):
ext = Extension()

schema = ext.get_config_schema()

self.assertIn('username', schema)
self.assertIn('password', schema)
self.assertIn("username", schema)
self.assertIn("password", schema)

def test_setup(self):
ext = Extension()
Expand All @@ -32,4 +31,5 @@ def test_setup(self):
ext.setup(registry)

registry.add.assert_called_once_with(
'frontend', frontend_lib.ScrobblerFrontend)
"frontend", frontend_lib.ScrobblerFrontend
)
92 changes: 43 additions & 49 deletions tests/test_frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,15 @@
from mopidy_scrobbler import frontend as frontend_lib


@mock.patch('mopidy_scrobbler.frontend.pylast', spec=pylast)
@mock.patch("mopidy_scrobbler.frontend.pylast", spec=pylast)
class FrontendTest(unittest.TestCase):

def setUp(self):
self.config = {
'scrobbler': {
'username': 'alice',
'password': 'secret',
}
"scrobbler": {"username": "alice", "password": "secret",}
}
self.frontend = frontend_lib.ScrobblerFrontend(
self.config, mock.sentinel.core)
self.config, mock.sentinel.core
)

def test_on_start_creates_lastfm_network(self, pylast_mock):
pylast_mock.md5.return_value = mock.sentinel.password_hash
Expand All @@ -30,13 +27,13 @@ def test_on_start_creates_lastfm_network(self, pylast_mock):
pylast_mock.LastFMNetwork.assert_called_with(
api_key=frontend_lib.API_KEY,
api_secret=frontend_lib.API_SECRET,
username='alice',
password_hash=mock.sentinel.password_hash)
username="alice",
password_hash=mock.sentinel.password_hash,
)

def test_on_start_stops_actor_on_error(self, pylast_mock):
pylast_mock.NetworkError = pylast.NetworkError
pylast_mock.LastFMNetwork.side_effect = (
pylast.NetworkError(None, 'foo'))
pylast_mock.LastFMNetwork.side_effect = pylast.NetworkError(None, "foo")
self.frontend.stop = mock.Mock()

self.frontend.on_start()
Expand All @@ -45,26 +42,28 @@ def test_on_start_stops_actor_on_error(self, pylast_mock):

def test_track_playback_started_updates_now_playing(self, pylast_mock):
self.frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork)
artists = [models.Artist(name='ABC'), models.Artist(name='XYZ')]
album = models.Album(name='The Collection')
artists = [models.Artist(name="ABC"), models.Artist(name="XYZ")]
album = models.Album(name="The Collection")
track = models.Track(
name='One Two Three',
name="One Two Three",
artists=artists,
album=album,
track_no=3,
length=180432,
musicbrainz_id='123-456')
musicbrainz_id="123-456",
)
tl_track = models.TlTrack(track=track, tlid=17)

self.frontend.track_playback_started(tl_track)

self.frontend.lastfm.update_now_playing.assert_called_with(
'ABC, XYZ',
'One Two Three',
duration='180',
album='The Collection',
track_number='3',
mbid='123-456')
"ABC, XYZ",
"One Two Three",
duration="180",
album="The Collection",
track_number="3",
mbid="123-456",
)

def test_track_playback_started_has_default_values(self, pylast_mock):
self.frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork)
Expand All @@ -74,18 +73,15 @@ def test_track_playback_started_has_default_values(self, pylast_mock):
self.frontend.track_playback_started(tl_track)

self.frontend.lastfm.update_now_playing.assert_called_with(
'',
'',
duration='0',
album='',
track_number='0',
mbid='')
"", "", duration="0", album="", track_number="0", mbid=""
)

def test_track_playback_started_catches_pylast_error(self, pylast_mock):
self.frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork)
pylast_mock.NetworkError = pylast.NetworkError
self.frontend.lastfm.update_now_playing.side_effect = (
pylast.NetworkError(None, 'foo'))
self.frontend.lastfm.update_now_playing.side_effect = pylast.NetworkError(
None, "foo"
)
track = models.Track()
tl_track = models.TlTrack(track=track, tlid=17)

Expand All @@ -94,27 +90,29 @@ def test_track_playback_started_catches_pylast_error(self, pylast_mock):
def test_track_playback_ended_scrobbles_played_track(self, pylast_mock):
self.frontend.last_start_time = 123
self.frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork)
artists = [models.Artist(name='ABC'), models.Artist(name='XYZ')]
album = models.Album(name='The Collection')
artists = [models.Artist(name="ABC"), models.Artist(name="XYZ")]
album = models.Album(name="The Collection")
track = models.Track(
name='One Two Three',
name="One Two Three",
artists=artists,
album=album,
track_no=3,
length=180432,
musicbrainz_id='123-456')
musicbrainz_id="123-456",
)
tl_track = models.TlTrack(track=track, tlid=17)

self.frontend.track_playback_ended(tl_track, 150000)

self.frontend.lastfm.scrobble.assert_called_with(
'ABC, XYZ',
'One Two Three',
'123',
duration='180',
album='The Collection',
track_number='3',
mbid='123-456')
"ABC, XYZ",
"One Two Three",
"123",
duration="180",
album="The Collection",
track_number="3",
mbid="123-456",
)

def test_track_playback_ended_has_default_values(self, pylast_mock):
self.frontend.last_start_time = 123
Expand All @@ -125,13 +123,8 @@ def test_track_playback_ended_has_default_values(self, pylast_mock):
self.frontend.track_playback_ended(tl_track, 150000)

self.frontend.lastfm.scrobble.assert_called_with(
'',
'',
'123',
duration='180',
album='',
track_number='0',
mbid='')
"", "", "123", duration="180", album="", track_number="0", mbid=""
)

def test_does_not_scrobble_tracks_shorter_than_30_sec(self, pylast_mock):
self.frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork)
Expand Down Expand Up @@ -163,8 +156,9 @@ def test_does_scrobble_if_played_not_half_but_240_sec(self, pylast_mock):
def test_track_playback_ended_catches_pylast_error(self, pylast_mock):
self.frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork)
pylast_mock.NetworkError = pylast.NetworkError
self.frontend.lastfm.scrobble.side_effect = (
pylast.NetworkError(None, 'foo'))
self.frontend.lastfm.scrobble.side_effect = pylast.NetworkError(
None, "foo"
)
track = models.Track(length=180432)
tl_track = models.TlTrack(track=track, tlid=17)

Expand Down

0 comments on commit 0499807

Please sign in to comment.