Implement support for the new directory search API

This commit is contained in:
Thomas Perl 2014-10-26 23:15:51 +01:00
parent 6b5864806d
commit 1e87a2a3fb
5 changed files with 68 additions and 23 deletions

View file

@ -22,28 +22,19 @@ import QtQuick 2.0
ListModel {
id: directorySearchModel
property string provider
function search(query, callback) {
clear();
var result = new XMLHttpRequest();
result.onreadystatechange = function() {
if (result.readyState == XMLHttpRequest.DONE) {
var data = JSON.parse(result.responseText);
data.sort(function (a, b) {
// Sort by subscriber count, descending
return b.subscribers - a.subscribers;
});
for (var i=0; i<data.length; i++) {
directorySearchModel.append(data[i]);
py.call('main.get_directory_entries', [directorySearchModel.provider, query], function (result) {
for (var i=0; i<result.length; i++) {
directorySearchModel.append(result[i]);
}
if (callback !== undefined) {
callback();
}
}
};
result.open('GET', 'http://gpodder.net/search.json?q=' + query);
result.send();
});
}
}

27
main.py
View file

@ -32,6 +32,7 @@ import gpodder
from gpodder.api import core
from gpodder.api import util
from gpodder.api import query
from gpodder.api import registry
import logging
import functools
@ -373,6 +374,30 @@ class gPotherSide:
def get_config_value(self, option):
return self.core.config.get_field(option)
def get_directory_providers(self):
def select_provider(p):
return p.kind in (p.PROVIDER_SEARCH, p.PROVIDER_STATIC)
return [{
'label': provider.name,
'can_search': provider.kind == provider.PROVIDER_SEARCH
} for provider in registry.directory.select(select_provider)]
def get_directory_entries(self, provider, query):
def match_provider(p):
return p.name == provider
for provider in registry.directory.select(match_provider):
return [{
'title': e.title,
'url': e.url,
'image': e.image,
'subscribers': e.subscribers,
'description': e.description,
} for e in provider.on_string(query)]
return []
gpotherside = gPotherSide()
pyotherside.atexit(gpotherside.atexit)
@ -399,3 +424,5 @@ mark_episodes_as_old = gpotherside.mark_episodes_as_old
save_playback_state = gpotherside.save_playback_state
set_config_value = gpotherside.set_config_value
get_config_value = gpotherside.get_config_value
get_directory_providers = gpotherside.get_directory_providers
get_directory_entries = gpotherside.get_directory_entries

View file

@ -24,6 +24,15 @@ import 'common'
SlidePage {
id: directory
property string provider
property bool can_search
Component.onCompleted: {
if (!directory.can_search) {
// Load static data
search('');
}
}
function search(text) {
loading.visible = true;
@ -40,7 +49,7 @@ SlidePage {
PScrollDecorator { flickable: listView }
model: GPodderDirectorySearchModel { id: directorySearchModel }
model: GPodderDirectorySearchModel { id: directorySearchModel; provider: directory.provider }
header: Column {
anchors {
@ -48,9 +57,11 @@ SlidePage {
right: parent.right
}
SlidePageHeader { title: 'Search gpodder.net' }
SlidePageHeader { title: directory.provider }
Column {
visible: directory.can_search
spacing: 0.5 * 30 * pgst.scalef
anchors {

View file

@ -46,7 +46,7 @@ ButtonArea {
width: 80 * pgst.scalef
height: 80 * pgst.scalef
source: scaled_logo_url
source: image
}
PLabel {
@ -70,6 +70,6 @@ ButtonArea {
verticalCenter: parent.verticalCenter
}
text: subscribers
text: (subscribers > 0) ? subscribers : ''
}
}

View file

@ -66,9 +66,25 @@ SlidePage {
},
},
{
label: 'Search gpodder.net',
label: 'Discover new podcasts',
callback: function () {
pgst.loadPage('Directory.qml');
py.call('main.get_directory_providers', [], function (result) {
var items = [];
for (var i=0; i<result.length; i++) {
(function (provider) {
items.push({
label: provider.label,
callback: function () {
pgst.loadPage('Directory.qml', {
provider: provider.label,
can_search: provider.can_search,
});
},
});
})(result[i]);
}
pgst.showSelection(items, 'Select provider');
});
},
},
]);