diff --git a/scripts/youtube/YouTube.png b/scripts/youtube/YouTube.png new file mode 100644 index 000000000..848e535ee Binary files /dev/null and b/scripts/youtube/YouTube.png differ diff --git a/scripts/youtube/script.ini b/scripts/youtube/script.ini new file mode 100644 index 000000000..b66469d9a --- /dev/null +++ b/scripts/youtube/script.ini @@ -0,0 +1,9 @@ +[Script] +name=YouTube +description=Finds songs on YouTube +author=John Maguire +url=http://www.clementine-player.org +icon=YouTube.png + +language=python +script_file=youtube.py diff --git a/scripts/youtube/youtube.py b/scripts/youtube/youtube.py new file mode 100644 index 000000000..fb4cd361b --- /dev/null +++ b/scripts/youtube/youtube.py @@ -0,0 +1,41 @@ +import clementine + +from PythonQt.Qt import QUrl +from PythonQt.QtGui import QAction +from PythonQt.QtGui import QDesktopServices +from PythonQt.QtNetwork import QNetworkRequest + +import json + +class Plugin: + def __init__(self): + self.action = QAction("Find on YouTube", None) + self.action.connect("activated()", self.SearchYoutube) + clementine.ui.AddAction("song_menu", self.action) + self.network = clementine.NetworkAccessManager() + + def SearchYoutube(self): + selection = clementine.playlists.current_selection().indexes() + title = selection[clementine.Playlist.Column_Title].data() + artist = selection[clementine.Playlist.Column_Artist].data() + query = title + ' ' + artist + url = QUrl('https://gdata.youtube.com/feeds/api/videos') + url.addQueryItem('q', query) + url.addQueryItem('alt', 'json') + url.addQueryItem('max-results', 1) + reply = self.network.get(QNetworkRequest(url)) + + def SearchFinished(): + data = json.loads(str(reply.readAll())) + feed = data['feed'] + try: + print feed['entry'][0]['media$group']['media$player'][0]['url'] + youtube_url = feed['entry'][0]['media$group']['media$player'][0]['url'] + QDesktopServices.openUrl(QUrl.fromEncoded(str(youtube_url))) + except Exception, e: + print e + + reply.connect("finished()", SearchFinished) + + +plugin = Plugin() diff --git a/src/scripting/python/pythonengine.cpp b/src/scripting/python/pythonengine.cpp index dc14e356e..9dd29eb97 100644 --- a/src/scripting/python/pythonengine.cpp +++ b/src/scripting/python/pythonengine.cpp @@ -42,8 +42,12 @@ #include "ui/settingsdialog.h" #include +#include #include +Q_DECLARE_METATYPE(QModelIndex) +Q_DECLARE_METATYPE(QList) + const char* PythonEngine::kClementineModuleName = "clementine"; const char* PythonEngine::kScriptModulePrefix = "clementinescripts"; PythonEngine* PythonEngine::sInstance = NULL; @@ -121,6 +125,7 @@ bool PythonEngine::EnsureInitialised() { RegisterListConverter("QList"); RegisterListConverter("QList"); RegisterListConverter("QList"); + RegisterListConverter("QList"); // Connect stdout, stderr connect(python_qt, SIGNAL(pythonStdOut(QString)), SLOT(PythonStdOut(QString))); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 80cc7bb34..34501117d 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -676,6 +676,8 @@ MainWindow::MainWindow( scripts_->ui()->RegisterActionLocation("help_menu", ui_->menu_help, NULL); scripts_->ui()->RegisterActionLocation("playlist_menu", ui_->menu_playlist, NULL); + scripts_->ui()->RegisterActionLocation("song_menu", playlist_menu_, NULL); + // Load theme StyleSheetLoader* css_loader = new StyleSheetLoader(this); css_loader->SetStyleSheet(this, ":mainwindow.css");