diff --git a/platypush/plugins/lastfm/__init__.py b/platypush/plugins/lastfm/__init__.py index a43230247..1a838d7ad 100644 --- a/platypush/plugins/lastfm/__init__.py +++ b/platypush/plugins/lastfm/__init__.py @@ -1,4 +1,5 @@ import time +from typing import Optional, List from platypush.plugins import Plugin, action @@ -29,6 +30,7 @@ class LastfmPlugin(Plugin): """ import pylast + super().__init__() self.api_key = api_key @@ -40,7 +42,8 @@ class LastfmPlugin(Plugin): api_key=self.api_key, api_secret=self.api_secret, username=self.username, - password_hash=pylast.md5(self.password)) + password_hash=pylast.md5(self.password), + ) @action def scrobble(self, artist, title, album=None): @@ -81,4 +84,58 @@ class LastfmPlugin(Plugin): album=album, ) + @action + def get_recent_tracks( + self, + username: Optional[str] = None, + limit: int = 10, + time_from: Optional[int] = None, + time_to: Optional[int] = None, + ) -> List[dict]: + """ + Get a list of recently played tracks. + + :param username: Target username (default: the one registered to this + plugin). + :param limit: Maximum number of tracks to be returned (default: 10). + :param time_from: Return tracks starting from this time + (as a UNIX timestamp). + :param time_to: Return tracks starting up to this time + (as a UNIX timestamp). + :return: Example: + + .. code-block:: json + + [ + { + "artist": "Led Zeppelin", + "title": "Stairway to Heaven", + "album": "IV", + "timestamp": 1654196137 + } + ] + + """ + + return [ + { + 'title': track.track.title, + 'album': track.album, + 'timestamp': int(track.timestamp or 0), + **( + {'artist': track.track.artist.name} + if track.track.artist + else {'artist': None} + ), + } + for track in self.lastfm.get_user( + username or self.username + ).get_recent_tracks( + limit=limit, + time_from=time_from, + time_to=time_to, + ) + ] + + # vim:sw=4:ts=4:et: