mirror of
https://github.com/clementine-player/Clementine
synced 2024-12-16 03:09:57 +01:00
87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
import clementine
|
|
|
|
from servicebase import DigitallyImportedServiceBase
|
|
|
|
from PythonQt.QtCore import QSettings, QUrl
|
|
from PythonQt.QtNetwork import QNetworkCookie, QNetworkCookieJar, QNetworkRequest
|
|
|
|
import re
|
|
|
|
class SkyFmService(DigitallyImportedServiceBase):
|
|
HOMEPAGE_URL = QUrl("http://www.sky.fm/")
|
|
HOMEPAGE_NAME = "sky.fm"
|
|
STREAM_LIST_URL = QUrl("http://listen.sky.fm/")
|
|
ICON_FILENAME = "icon-sky.png"
|
|
SERVICE_NAME = "SKY.fm"
|
|
SERVICE_DESCRIPTION = "SKY.fm"
|
|
URL_SCHEME = "skyfm"
|
|
|
|
HASHKEY_RE = re.compile(r'hashKey\s*=\s*\'([0-9a-f]+)\'')
|
|
|
|
# These have to be in the same order as in the settings dialog
|
|
PLAYLISTS = [
|
|
{"premium": False, "url": "http://listen.sky.fm/public3/%s.pls"},
|
|
{"premium": True, "url": "http://listen.sky.fm/premium_high/%s.pls?hash=%s"},
|
|
{"premium": False, "url": "http://listen.sky.fm/public1/%s.pls"},
|
|
{"premium": True, "url": "http://listen.sky.fm/premium_medium/%s.pls?hash=%s"},
|
|
{"premium": True, "url": "http://listen.sky.fm/premium/%s.pls?hash=%s"},
|
|
{"premium": False, "url": "http://listen.sky.fm/public5/%s.asx"},
|
|
{"premium": True, "url": "http://listen.sky.fm/premium_wma_low/%s.asx?hash=%s"},
|
|
{"premium": True, "url": "http://listen.sky.fm/premium_wma/%s.asx?hash=%s"},
|
|
]
|
|
|
|
def __init__(self, model, settings_dialog_callback):
|
|
DigitallyImportedServiceBase.Init(self, model, settings_dialog_callback)
|
|
|
|
self.last_key = None
|
|
|
|
def LoadStation(self, key):
|
|
# Non-premium streams can just start loading straight away
|
|
if not self.PLAYLISTS[self.audio_type]["premium"]:
|
|
self.LoadPlaylist(key)
|
|
return
|
|
|
|
# Otherwise we have to get the user's hashKey
|
|
request = QNetworkRequest(QUrl("http://www.sky.fm/configure_player.php"))
|
|
postdata = "amember_login=%s&amember_pass=%s" % (
|
|
QUrl.toPercentEncoding(self.username),
|
|
QUrl.toPercentEncoding(self.password))
|
|
|
|
reply = self.network.post(request, postdata)
|
|
reply.connect("finished()", self.LoadHashKeyFinished)
|
|
|
|
self.last_key = key
|
|
|
|
def LoadHashKeyFinished(self):
|
|
# Get the QNetworkReply that called this slot
|
|
reply = self.sender()
|
|
reply.deleteLater()
|
|
|
|
# Parse the hashKey out of the reply
|
|
data = reply.readAll()
|
|
match = self.HASHKEY_RE.search(data)
|
|
|
|
if match:
|
|
hash_key = match.group(1)
|
|
else:
|
|
clementine.task_manager.SetTaskFinished(self.task_id)
|
|
self.task_id = None
|
|
self.StreamError(self.tr("Invalid SKY.fm username or password"))
|
|
return
|
|
|
|
# Now we can load the playlist
|
|
self.LoadPlaylist(self.last_key, hash_key)
|
|
|
|
def LoadPlaylist(self, key, hash_key=None):
|
|
playlist_url = self.PLAYLISTS[self.audio_type]["url"]
|
|
|
|
if hash_key:
|
|
playlist_url = playlist_url % (key, hash_key)
|
|
else:
|
|
playlist_url = playlist_url % key
|
|
|
|
# Start fetching the playlist. Can't use a SongLoader to do this because
|
|
# we have to use the cookies we set in ReloadSettings()
|
|
self.load_station_reply = self.network.get(QNetworkRequest(QUrl(playlist_url)))
|
|
self.load_station_reply.connect("finished()", self.LoadPlaylistFinished)
|