Skip to content

Commit

Permalink
Initial updates for mopidy v3/python 3
Browse files Browse the repository at this point in the history
  • Loading branch information
abates committed Jun 26, 2020
1 parent 234acc3 commit 963b4ec
Show file tree
Hide file tree
Showing 17 changed files with 81 additions and 75 deletions.
2 changes: 1 addition & 1 deletion mopidy_pandora/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def get_default_config(self):
return config.read(conf_file)

def get_config_schema(self):
from pandora import BaseAPIClient
from pandora.client import BaseAPIClient

schema = super(Extension, self).get_config_schema()
schema["api_host"] = config.String()
Expand Down
18 changes: 9 additions & 9 deletions mopidy_pandora/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from cachetools import TTLCache

import pandora
from pandora.client import APIClient, BaseAPIClient
from pandora.clientbuilder import (
APITransport,
DEFAULT_API_HOST,
Expand Down Expand Up @@ -39,7 +39,7 @@ def build_from_settings_dict(self, settings):
)


class MopidyAPIClient(pandora.APIClient):
class MopidyAPIClient(APIClient):
"""Pydora API Client for Mopidy-Pandora
This API client implements caching of the station list.
Expand All @@ -52,7 +52,7 @@ def __init__(
partner_user,
partner_password,
device,
default_audio_quality=pandora.BaseAPIClient.MED_AUDIO_QUALITY,
default_audio_quality=BaseAPIClient.MED_AUDIO_QUALITY,
):

super(MopidyAPIClient, self).__init__(
Expand All @@ -66,7 +66,7 @@ def get_station_list(self, force_refresh=False):
station_list = []
try:
if self.station_list_cache.currsize == 0 or (
force_refresh and self.station_list_cache.values()[0].has_changed()
force_refresh and next(iter(self.station_list_cache.values())).has_changed()
):

station_list = super(MopidyAPIClient, self).get_station_list()
Expand All @@ -77,8 +77,8 @@ def get_station_list(self, force_refresh=False):
station_list = []

try:
return self.station_list_cache.values()[0]
except IndexError:
return next(iter(self.station_list_cache.values()))
except StopIteration:
# Cache disabled
return station_list

Expand All @@ -93,7 +93,7 @@ def get_genre_stations(self, force_refresh=False):
genre_stations = []
try:
if self.genre_stations_cache.currsize == 0 or (
force_refresh and self.genre_stations_cache.values()[0].has_changed()
force_refresh and next(iter(self.genre_stations_cache.values())).has_changed()
):

genre_stations = super(MopidyAPIClient, self).get_genre_stations()
Expand All @@ -104,7 +104,7 @@ def get_genre_stations(self, force_refresh=False):
return genre_stations

try:
return self.genre_stations_cache.values()[0]
except IndexError:
return next(iter(self.genre_stations_cache.values()))
except StopIteration:
# Cache disabled
return genre_stations
4 changes: 2 additions & 2 deletions mopidy_pandora/frontend.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import absolute_import, division, print_function, unicode_literals

import Queue
from queue import PriorityQueue

import logging

Expand Down Expand Up @@ -276,7 +276,7 @@ def on_start(self):
return

interval = float(self.config["double_click_interval"])
self.sequence_match_results = Queue.PriorityQueue(maxsize=4)
self.sequence_match_results = PriorityQueue(maxsize=4)

self.event_sequences.append(
EventSequence(
Expand Down
9 changes: 6 additions & 3 deletions mopidy_pandora/library.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,9 @@ def lookup(self, uri):
# updated to make use of the newer LibraryController.get_images()
images = self.get_images([uri])[uri]
if len(images) > 0:
album_kwargs = {"images": [image.uri for image in images]}
# TODO: Fix images (use mopidy.core.LibraryController.get_images - see mopidy changelog
#album_kwargs = {"images": [image.uri for image in images]}
pass

if isinstance(pandora_uri, AdItemUri):
track_kwargs["name"] = "Advertisement"
Expand All @@ -112,7 +114,8 @@ def lookup(self, uri):
album_kwargs["name"] = track.album_name
elif isinstance(pandora_uri, StationUri):
station = self.backend.api.get_station(pandora_uri.station_id)
album_kwargs = {"images": [station.art_url]}
# TODO: Fix images (use mopidy.core.LibraryController.get_images - see mopidy changelog
#album_kwargs = {"images": [station.art_url]}
track_kwargs["name"] = station.name
artist_kwargs["name"] = "Pandora Station"
album_kwargs["name"] = ", ".join(station.genre)
Expand Down Expand Up @@ -165,7 +168,7 @@ def get_images(self, uris):

def _formatted_station_list(self, list):
# Find QuickMix stations and move QuickMix to top
for i, station in enumerate(list[:]):
for i, station in enumerate(list):
if station.is_quickmix:
quickmix_stations = station.quickmix_stations
if not station.name.endswith(" (marked with *)"):
Expand Down
17 changes: 11 additions & 6 deletions mopidy_pandora/uri.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@

import re

from mopidy import compat, models
from mopidy import models

from pandora.models.pandora import AdItem, GenreStation, PlaylistItem, Station
from pandora.models.ad import AdItem
from pandora.models.station import GenreStation, Station
from pandora.models.playlist import PlaylistItem

from requests.utils import quote, unquote

Expand Down Expand Up @@ -38,6 +40,7 @@ def __repr__(self):
def encoded_attributes(self):
encoded_dict = {}
for k, v in list(self.__dict__.items()):
print(f"Ecoding {v}\n")
encoded_dict[k] = quote(PandoraUri.encode(v))

return encoded_dict
Expand All @@ -50,13 +53,15 @@ def uri(self):
def encode(cls, value):
if value is None:
value = ""
if isinstance(value, compat.text_type):
if isinstance(value, str):
value = value.encode("utf-8")
if isinstance(value, int):
value = f"{value}"
return value

@classmethod
def factory(cls, obj):
if isinstance(obj, basestring): # noqa: F821
if isinstance(obj, str): # noqa: F821
# A string
return PandoraUri._from_uri(obj)

Expand All @@ -78,7 +83,7 @@ def factory(cls, obj):

@classmethod
def _from_uri(cls, uri):
parts = [unquote(cls.encode(p)) for p in uri.split(":")]
parts = [unquote(p) for p in uri.split(":")]
if not parts or parts[0] != PandoraUri.SCHEME or len(parts) < 2:
raise NotImplementedError("Not a Pandora URI: {}".format(uri))
uri_cls = cls.TYPES.get(parts[1])
Expand Down Expand Up @@ -117,7 +122,7 @@ def is_pandora_uri(cls, uri):
try:
return (
uri
and isinstance(uri, basestring) # noqa: F821
and isinstance(uri, str) # noqa: F821
and uri.startswith(PandoraUri.SCHEME)
and PandoraUri.factory(uri)
)
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def run_tests(self):
"cachetools >= 1.0.0",
"Mopidy >= 1.1.2",
"Pykka >= 1.1",
"pydora >= 1.13,<2",
"pydora >= 2,<3",
"requests >= 2.5.0",
],
tests_require=["tox"],
Expand Down
24 changes: 9 additions & 15 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,19 @@
from __future__ import absolute_import, division, print_function, unicode_literals

import Queue
from queue import PriorityQueue
import json
import threading

import mock
from mopidy import models
import pykka

from pandora import APIClient
from pandora.client import APIClient

from pandora.models.pandora import (
AdItem,
GenreStation,
GenreStationList,
PlaylistItem,
SearchResult,
SearchResultItem,
Station,
StationList,
)
from pandora.models.ad import AdItem
from pandora.models.station import GenreStation, GenreStationList, Station, StationList
from pandora.models.playlist import PlaylistItem
from pandora.models.search import SearchResult, SearchResultItem

import pytest

Expand Down Expand Up @@ -58,8 +52,8 @@
@pytest.fixture
def config():
return {
"http": {"hostname": "127.0.0.1", "port": "6680"},
"proxy": {"hostname": "host_mock", "port": "port_mock"},
"http": {"hostname": "127.0.0.1", "port": 6680},
"proxy": {"hostname": "host_mock", "port": 80},
"pandora": {
"enabled": True,
"api_host": "test_host",
Expand Down Expand Up @@ -123,7 +117,7 @@ def mopidy_with_monitor(config, mopidy):

@pytest.fixture
def rq():
return Queue.PriorityQueue()
return PriorityQueue()


@pytest.fixture
Expand Down
2 changes: 1 addition & 1 deletion tests/dummy_audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(self, config=None, mixer=None):
self._tags = {}
self._bad_uris = set()

def set_uri(self, uri):
def set_uri(self, uri, live_stream=False, download=False):
assert self._uri is None, "prepare change not called before set"
self._tags = {}
self._uri = uri
Expand Down
16 changes: 8 additions & 8 deletions tests/dummy_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def create_proxy(cls, config=None, audio=None):

class DummyBackend(pykka.ThreadingActor, backend.Backend):
def __init__(self, config, audio):
super(DummyBackend, self).__init__()
super().__init__()

self.library = DummyLibraryProvider(backend=self)
if audio is None:
Expand All @@ -36,15 +36,15 @@ def __init__(self, config, audio):

class DummyPandoraBackend(DummyBackend):
def __init__(self, config, audio):
super(DummyPandoraBackend, self).__init__(config, audio)
super().__init__(config, audio)
self.uri_schemes = ["pandora"]


class DummyLibraryProvider(backend.LibraryProvider):
root_directory = Ref.directory(uri="mock:/", name="mock")

def __init__(self, *args, **kwargs):
super(DummyLibraryProvider, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
self.dummy_library = []
self.dummy_get_distinct_result = {}
self.dummy_browse_result = {}
Expand All @@ -71,7 +71,7 @@ def search(self, query=None, uris=None, exact=False):

class DummyPlaybackProvider(backend.PlaybackProvider):
def __init__(self, *args, **kwargs):
super(DummyPlaybackProvider, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)
self._uri = None
self._time_position = 0

Expand Down Expand Up @@ -107,21 +107,21 @@ def get_time_position(self):

class DummyPandoraPlaybackProvider(DummyPlaybackProvider):
def __init__(self, *args, **kwargs):
super(DummyPandoraPlaybackProvider, self).__init__(*args, **kwargs)
super().__init__(*args, **kwargs)

def change_track(self, track):
listener.send(PandoraPlaybackListener, "track_changing", track=track)
return super(DummyPandoraPlaybackProvider, self).change_track(track)
return super().change_track(track)


class DummyPandoraPlaybackProviderWithAudioEvents(backend.PlaybackProvider):
def __init__(self, *args, **kwargs):
super(DummyPandoraPlaybackProviderWithAudioEvents, self).__init__(
super().__init__(
*args, **kwargs
)

def change_track(self, track):
listener.send(PandoraPlaybackListener, "track_changing", track=track)
return super(DummyPandoraPlaybackProviderWithAudioEvents, self).change_track(
return super().change_track(
track
)
6 changes: 3 additions & 3 deletions tests/dummy_mopidy.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from __future__ import absolute_import, division, print_function, unicode_literals

import Queue
import queue

import mock

Expand Down Expand Up @@ -67,7 +67,7 @@ def lookup(uris):
self.core.library.lookup = lookup
self.tl_tracks = self.core.tracklist.add(uris=self.uris).get()

self.events = Queue.Queue()
self.events = queue.Queue()

def send(cls, event, **kwargs):
self.events.put((cls, event, kwargs))
Expand Down Expand Up @@ -101,6 +101,6 @@ def replay_events(self, until=None):
else:
if isinstance(actor, cls):
actor.on_event(event, **kwargs)
except Queue.Empty:
except queue.Empty:
# All events replayed.
break
2 changes: 1 addition & 1 deletion tests/test_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from mopidy import backend as backend_api
from mopidy import models

from pandora import APIClient, BaseAPIClient
from pandora.client import APIClient, BaseAPIClient
from pandora.errors import PandoraException

from mopidy_pandora import client, library, playback
Expand Down
10 changes: 5 additions & 5 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

import mock

from pandora import APIClient
from pandora.models.pandora import GenreStationList, StationList, Station
from pandora.client import APIClient
from pandora.models.station import GenreStationList, StationList, Station

import pytest

Expand Down Expand Up @@ -92,7 +92,7 @@ def test_get_genre_stations_changed_cached(
backend.api.genre_stations_cache[time.time()] = station_list

assert backend.api.get_genre_stations().checksum == cached_checksum
assert len(backend.api.genre_stations_cache.values()[0]) == len(
assert len(next(iter(backend.api.genre_stations_cache.values()))) == len(
GenreStationList.from_json(APIClient, mock_cached_result["result"])
)

Expand Down Expand Up @@ -168,7 +168,7 @@ def test_get_station_list_changed_cached(config, get_station_list_return_value_m
)

assert backend.api.get_station_list().checksum == cached_checksum
assert len(backend.api.station_list_cache.values()[0]) == len(
assert len(next(iter(backend.api.station_list_cache.values()))) == len(
StationList.from_json(APIClient, mock_cached_result["result"])
)

Expand Down Expand Up @@ -222,7 +222,7 @@ def test_get_station_list_changed_refreshed(
backend.api.get_station_list(force_refresh=True).checksum
== conftest.MOCK_STATION_LIST_CHECKSUM
)
assert len(backend.api.station_list_cache.values()[0]) == len(
assert len(next(iter(backend.api.station_list_cache.values()))) == len(
station_list_result_mock["stations"]
)

Expand Down
Loading

0 comments on commit 963b4ec

Please sign in to comment.