Fix some bugs in loading premium di.fm and sky.fm streams
This commit is contained in:
parent
a2e4f8e6b3
commit
387b5cd5ff
|
@ -5,6 +5,11 @@ from servicebase import DigitallyImportedServiceBase
|
||||||
from PythonQt.QtCore import QSettings, QUrl
|
from PythonQt.QtCore import QSettings, QUrl
|
||||||
from PythonQt.QtNetwork import QNetworkCookie, QNetworkCookieJar, QNetworkRequest
|
from PythonQt.QtNetwork import QNetworkCookie, QNetworkCookieJar, QNetworkRequest
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
LOGGER = logging.getLogger("di.service")
|
||||||
|
|
||||||
|
|
||||||
class DigitallyImportedService(DigitallyImportedServiceBase):
|
class DigitallyImportedService(DigitallyImportedServiceBase):
|
||||||
HOMEPAGE_URL = QUrl("http://www.di.fm/")
|
HOMEPAGE_URL = QUrl("http://www.di.fm/")
|
||||||
HOMEPAGE_NAME = "di.fm"
|
HOMEPAGE_NAME = "di.fm"
|
||||||
|
@ -29,8 +34,15 @@ class DigitallyImportedService(DigitallyImportedServiceBase):
|
||||||
def __init__(self, model, settings_dialog_callback):
|
def __init__(self, model, settings_dialog_callback):
|
||||||
DigitallyImportedServiceBase.Init(self, model, settings_dialog_callback)
|
DigitallyImportedServiceBase.Init(self, model, settings_dialog_callback)
|
||||||
|
|
||||||
def ReloadSettings(self):
|
self.last_username_password = None
|
||||||
DigitallyImportedServiceBase.ReloadSettings(self)
|
self.MaybeReloadCookies()
|
||||||
|
|
||||||
|
def MaybeReloadCookies(self):
|
||||||
|
if self.last_username_password == (self.username, self.password):
|
||||||
|
return
|
||||||
|
self.last_username_password = (self.username, self.password)
|
||||||
|
|
||||||
|
LOGGER.debug("Setting network cookies after config change")
|
||||||
|
|
||||||
# If a username and password were set by the user then set them in the
|
# If a username and password were set by the user then set them in the
|
||||||
# cookies we pass to www.di.fm
|
# cookies we pass to www.di.fm
|
||||||
|
@ -38,14 +50,17 @@ class DigitallyImportedService(DigitallyImportedServiceBase):
|
||||||
if len(self.username) and len(self.password):
|
if len(self.username) and len(self.password):
|
||||||
cookie_jar = QNetworkCookieJar()
|
cookie_jar = QNetworkCookieJar()
|
||||||
cookie_jar.setCookiesFromUrl([
|
cookie_jar.setCookiesFromUrl([
|
||||||
QNetworkCookie("_amember_ru", self.username),
|
QNetworkCookie("_amember_ru", self.username.encode("utf-8")),
|
||||||
QNetworkCookie("_amember_rp", self.password),
|
QNetworkCookie("_amember_rp", self.password.encode("utf-8")),
|
||||||
], QUrl("http://www.di.fm/"))
|
], QUrl("http://www.di.fm/"))
|
||||||
self.network.setCookieJar(cookie_jar)
|
self.network.setCookieJar(cookie_jar)
|
||||||
|
|
||||||
def LoadStation(self, key):
|
def LoadStation(self, key):
|
||||||
|
self.MaybeReloadCookies()
|
||||||
playlist_url = self.PLAYLISTS[self.audio_type]["url"] % key
|
playlist_url = self.PLAYLISTS[self.audio_type]["url"] % key
|
||||||
|
|
||||||
|
LOGGER.info("Getting playlist URL '%s'" % playlist_url)
|
||||||
|
|
||||||
# Start fetching the playlist. Can't use a SongLoader to do this because
|
# Start fetching the playlist. Can't use a SongLoader to do this because
|
||||||
# we have to use the cookies we set in ReloadSettings()
|
# 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 = self.network.get(QNetworkRequest(QUrl(playlist_url)))
|
||||||
|
|
|
@ -26,7 +26,7 @@ class SettingsDialog(QDialog):
|
||||||
self.username.setText(settings.value("username", ""))
|
self.username.setText(settings.value("username", ""))
|
||||||
self.password.setText(settings.value("password", ""))
|
self.password.setText(settings.value("password", ""))
|
||||||
|
|
||||||
QDialog.showEvent(self, event)
|
#QDialog.showEvent(self, event)
|
||||||
|
|
||||||
def accept(self):
|
def accept(self):
|
||||||
# Save the settings
|
# Save the settings
|
||||||
|
|
|
@ -34,6 +34,7 @@ class SkyFmService(DigitallyImportedServiceBase):
|
||||||
DigitallyImportedServiceBase.Init(self, model, settings_dialog_callback)
|
DigitallyImportedServiceBase.Init(self, model, settings_dialog_callback)
|
||||||
|
|
||||||
self.last_key = None
|
self.last_key = None
|
||||||
|
self.load_station_reply = None
|
||||||
|
|
||||||
def LoadStation(self, key):
|
def LoadStation(self, key):
|
||||||
# Non-premium streams can just start loading straight away
|
# Non-premium streams can just start loading straight away
|
||||||
|
@ -47,19 +48,19 @@ class SkyFmService(DigitallyImportedServiceBase):
|
||||||
QUrl.toPercentEncoding(self.username),
|
QUrl.toPercentEncoding(self.username),
|
||||||
QUrl.toPercentEncoding(self.password))
|
QUrl.toPercentEncoding(self.password))
|
||||||
|
|
||||||
reply = self.network.post(request, postdata)
|
self.load_station_reply = self.network.post(request, postdata)
|
||||||
reply.connect("finished()", self.LoadHashKeyFinished)
|
self.load_station_reply.connect("finished()", self.LoadHashKeyFinished)
|
||||||
|
|
||||||
self.last_key = key
|
self.last_key = key
|
||||||
|
|
||||||
def LoadHashKeyFinished(self):
|
def LoadHashKeyFinished(self):
|
||||||
# Get the QNetworkReply that called this slot
|
if self.load_station_reply is None:
|
||||||
reply = self.sender()
|
return
|
||||||
reply.deleteLater()
|
|
||||||
|
|
||||||
# Parse the hashKey out of the reply
|
# Parse the hashKey out of the reply
|
||||||
data = reply.readAll()
|
data = self.load_station_reply.readAll().data()
|
||||||
match = self.HASHKEY_RE.search(data)
|
match = self.HASHKEY_RE.search(data)
|
||||||
|
self.load_station_reply = None
|
||||||
|
|
||||||
if match:
|
if match:
|
||||||
hash_key = match.group(1)
|
hash_key = match.group(1)
|
||||||
|
|
|
@ -59,6 +59,7 @@
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QLibraryInfo>
|
#include <QLibraryInfo>
|
||||||
|
#include <QNetworkCookie>
|
||||||
#include <QNetworkProxyFactory>
|
#include <QNetworkProxyFactory>
|
||||||
#include <QSqlDatabase>
|
#include <QSqlDatabase>
|
||||||
#include <QSqlQuery>
|
#include <QSqlQuery>
|
||||||
|
@ -215,6 +216,8 @@ int main(int argc, char *argv[]) {
|
||||||
qRegisterMetaType<smart_playlists::GeneratorPtr>("smart_playlists::GeneratorPtr");
|
qRegisterMetaType<smart_playlists::GeneratorPtr>("smart_playlists::GeneratorPtr");
|
||||||
qRegisterMetaType<ColumnAlignmentMap>("ColumnAlignmentMap");
|
qRegisterMetaType<ColumnAlignmentMap>("ColumnAlignmentMap");
|
||||||
qRegisterMetaTypeStreamOperators<QMap<int, int> >("ColumnAlignmentMap");
|
qRegisterMetaTypeStreamOperators<QMap<int, int> >("ColumnAlignmentMap");
|
||||||
|
qRegisterMetaType<QNetworkCookie>("QNetworkCookie");
|
||||||
|
qRegisterMetaType<QList<QNetworkCookie> >("QList<QNetworkCookie>");
|
||||||
|
|
||||||
qRegisterMetaType<GstBuffer*>("GstBuffer*");
|
qRegisterMetaType<GstBuffer*>("GstBuffer*");
|
||||||
qRegisterMetaType<GstElement*>("GstElement*");
|
qRegisterMetaType<GstElement*>("GstElement*");
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
|
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QModelIndex>
|
#include <QModelIndex>
|
||||||
|
#include <QNetworkCookie>
|
||||||
#include <QtDebug>
|
#include <QtDebug>
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(QModelIndex)
|
Q_DECLARE_METATYPE(QModelIndex)
|
||||||
|
@ -126,6 +127,7 @@ bool PythonEngine::EnsureInitialised() {
|
||||||
RegisterListConverter<CoverSearchResult>("QList<CoverSearchResult>");
|
RegisterListConverter<CoverSearchResult>("QList<CoverSearchResult>");
|
||||||
RegisterListConverter<PlaylistItemPtr>("QList<PlaylistItemPtr>");
|
RegisterListConverter<PlaylistItemPtr>("QList<PlaylistItemPtr>");
|
||||||
RegisterListConverter<QModelIndex>("QList<QModelIndex>");
|
RegisterListConverter<QModelIndex>("QList<QModelIndex>");
|
||||||
|
RegisterListConverter<QNetworkCookie>("QList<QNetworkCookie>");
|
||||||
|
|
||||||
// Connect stdout, stderr
|
// Connect stdout, stderr
|
||||||
connect(python_qt, SIGNAL(pythonStdOut(QString)), SLOT(PythonStdOut(QString)));
|
connect(python_qt, SIGNAL(pythonStdOut(QString)), SLOT(PythonStdOut(QString)));
|
||||||
|
|
Loading…
Reference in New Issue