summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2015-07-12 15:02:38 +0200
committerBastien Nocera <hadess@hadess.net>2015-07-21 14:38:45 +0200
commitb6c474d99085af80b5058ef385bc54617bf0521a (patch)
tree82e903afa38b7f3ecbc588c142f3bb10ce6fc2f3 /src
parentb5c2560bdc760c96b1101f498e414bb2215cc6e6 (diff)
downloadgrilo-plugins-b6c474d99085af80b5058ef385bc54617bf0521a.tar.gz
lua-factory: Add lua-based Pocket plugin
Diffstat (limited to 'src')
-rw-r--r--src/lua-factory/sources/Makefile.am16
-rw-r--r--src/lua-factory/sources/grl-pocket.gresource.xml6
-rw-r--r--src/lua-factory/sources/grl-pocket.lua182
-rw-r--r--src/lua-factory/sources/pocket.svg137
4 files changed, 338 insertions, 3 deletions
diff --git a/src/lua-factory/sources/Makefile.am b/src/lua-factory/sources/Makefile.am
index 5a5da62..68da128 100644
--- a/src/lua-factory/sources/Makefile.am
+++ b/src/lua-factory/sources/Makefile.am
@@ -16,7 +16,9 @@ lua_sources_DATA = \
grl-euronews.gresource \
grl-guardianvideos.gresource \
grl-radiofrance.gresource \
- grl-video-title-parsing.lua
+ grl-video-title-parsing.lua \
+ grl-pocket.lua \
+ grl-pocket.gresource
lua_sourcesdir = $(datadir)/$(LUA_FACTORY_SOURCE_LOCATION)
@@ -29,7 +31,14 @@ grl-guardianvideos.gresource: grl-guardianvideos.gresource.xml
grl-radiofrance.gresource: grl-radiofrance.gresource.xml
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $(srcdir)/grl-radiofrance.gresource.xml
-CLEANFILES = grl-euronews.gresource grl-guardianvideos.gresource grl-radiofrance.gresource
+grl-pocket.gresource: grl-pocket.gresource.xml
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $(srcdir)/grl-pocket.gresource.xml
+
+CLEANFILES = \
+ grl-euronews.gresource \
+ grl-guardianvideos.gresource \
+ grl-radiofrance.gresource \
+ grl-pocket.gresource
EXTRA_DIST += \
$(lua_sources_DATA) \
@@ -38,6 +47,7 @@ EXTRA_DIST += \
grl-radiofrance.gresource.xml \
euronews.svg \
guardianvideos.svg \
- radiofrance.png
+ radiofrance.png \
+ pocket.svg
-include $(top_srcdir)/git.mk
diff --git a/src/lua-factory/sources/grl-pocket.gresource.xml b/src/lua-factory/sources/grl-pocket.gresource.xml
new file mode 100644
index 0000000..9fb74e1
--- /dev/null
+++ b/src/lua-factory/sources/grl-pocket.gresource.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/grilo/plugins/pocket">
+ <file compressed="true">pocket.svg</file>
+ </gresource>
+</gresources>
diff --git a/src/lua-factory/sources/grl-pocket.lua b/src/lua-factory/sources/grl-pocket.lua
new file mode 100644
index 0000000..505c624
--- /dev/null
+++ b/src/lua-factory/sources/grl-pocket.lua
@@ -0,0 +1,182 @@
+--[[
+ * Copyright (C) 2015 Bastien Nocera
+ *
+ * Contact: Bastien Nocera <hadess@hadess.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+--]]
+
+-- Documented at:
+-- http://getpocket.com/developer/docs/v3/retrieve
+--
+-- We only get videos here because if we didn't filter ahead of time
+-- we'd need to check whether each URL was supported through
+-- totem-pl-parser/quvi, which would be too slow
+POCKET_GET_URL = 'https://getpocket.com/v3/get?consumer_key=%s&access_token=%s&sort=newest&contentType=video&detailType=complete&count=%d&offset=%d'
+
+HAS_VIDEO = '1'
+IS_VIDEO = '2'
+
+---------------------------
+-- Source initialization --
+---------------------------
+
+source = {
+ id = "grl-pocket-lua",
+ name = 'Pocket',
+ description = 'A source for browsing Pocket videos',
+ goa_account_provider = 'pocket',
+ goa_account_feature = 'read-later',
+ supported_keys = { 'id', 'thumbnail', 'title', 'url', 'favourite', 'creation-date' },
+ supported_media = 'video',
+ icon = 'resource:///org/gnome/grilo/plugins/pocket/pocket.svg',
+ tags = { 'net:internet' }
+}
+
+------------------
+-- Source utils --
+------------------
+
+function grl_source_browse(media_id)
+ local count = grl.get_options("count")
+ local skip = grl.get_options("skip")
+ local operation_id = grl.get_options('operation-id')
+
+ local url = string.format(POCKET_GET_URL, grl.goa_consumer_key(), grl.goa_access_token(), count, skip)
+ grl.debug ("Fetching URL: " .. url .. " (count: " .. count .. " skip: " .. skip .. ")")
+
+ grl.fetch(url, "pocket_fetch_cb")
+end
+
+------------------------
+-- Callback functions --
+------------------------
+
+-- Newest first
+function sort_added_func(itema, itemb)
+ return itema.time_added > itemb.time_added
+end
+
+-- From http://lua-users.org/wiki/StringRecipes
+function string.starts(String,Start)
+ return string.sub(String,1,string.len(Start))==Start
+end
+
+-- return all the media found
+function pocket_fetch_cb(results)
+ local count = grl.get_options("count")
+
+ if not results then
+ grl.callback ()
+ return
+ end
+
+ json = grl.lua.json.string_to_table(results)
+
+ -- Put the table in an array so we can sort it
+ local array = {}
+ for n, item in pairs(json.list) do table.insert(array, item) end
+ table.sort(array, sort_added_func)
+
+ for i, item in ipairs(array) do
+ local media = create_media(item)
+ if media then
+ count = count - 1
+ grl.callback(media, count)
+ end
+
+ -- Bail out if we've given enough items
+ if count == 0 then
+ return
+ end
+ end
+
+ grl.callback()
+end
+
+-------------
+-- Helpers --
+-------------
+
+function create_media(item)
+ local media = {}
+
+ if not item.has_video or
+ (item.has_video ~= HAS_VIDEO and item.has_video ~= IS_VIDEO) then
+ grl.debug("We filtered for videos, but this isn't one: " .. grl.lua.inspect(item))
+ return nil
+ end
+
+ if item.has_video == HAS_VIDEO then
+ if not item.videos then
+ grl.debug('Item has no video, skipping: ' .. grl.lua.inspect(item))
+ return nil
+ end
+
+ if #item.videos > 1 then
+ grl.debug('Item has than one video, skipping: ' .. grl.lua.inspect(item))
+ return nil
+ end
+ end
+
+ media.type = "video"
+
+ media.id = item.resolved_id
+ if media.id == '' then
+ media.id = item.item_id
+ end
+
+ local url = item.resolved_url
+ if url == '' then
+ url = item.given_url
+ end
+
+ if item.has_video == HAS_VIDEO then
+ url = item.videos['1'].src
+
+ -- BUG: Pocket puts garbage like:
+ -- src = "//player.vimeo.com/video/75911370"
+ -- FIXME: this should be https instead but then
+ -- quvi doesn't detect it
+ if string.starts(url, '//') then url = 'http:' .. url end
+ end
+
+ if grl.is_video_site(url) then
+ media.external_url = url
+ else
+ media.url = url
+ end
+
+ media.title = item.resolved_title
+ if media.title == '' then
+ media.title = item.given_title
+ end
+ if media.title == '' then
+ media.title = media.url
+ end
+
+ media.favourite = (item.favorite and item.favorite == '1')
+
+ if item.image then
+ media.thumbnail = item.image.src
+ end
+
+ media.creation_date = item.time_added
+ media.modification_date = item.time_updated
+
+ return media
+end
diff --git a/src/lua-factory/sources/pocket.svg b/src/lua-factory/sources/pocket.svg
new file mode 100644
index 0000000..90e834c
--- /dev/null
+++ b/src/lua-factory/sources/pocket.svg
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="256"
+ height="256"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="channel-youtube.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ id="clipPath6193"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6195"
+ d="m 1600,2252.8 5020,0 0,3650 -5020,0 0,-3650 z" />
+ </clipPath>
+ <linearGradient
+ id="linearGradient6181"
+ spreadMethod="pad"
+ gradientTransform="matrix(-3.593e-5,822,822,3.593e-5,411,0)"
+ gradientUnits="userSpaceOnUse"
+ y2="0"
+ x2="1"
+ y1="0"
+ x1="0">
+ <stop
+ id="stop6183"
+ offset="0"
+ style="stop-opacity:1;stop-color:#c01e25" />
+ <stop
+ id="stop6185"
+ offset="1"
+ style="stop-opacity:1;stop-color:#e62426" />
+ </linearGradient>
+ <clipPath
+ id="clipPath6177"
+ clipPathUnits="userSpaceOnUse">
+ <path
+ id="path6179"
+ d="M 8220,0 0,0 l 0,8220 8220,0 0,-8220 m -6620,5902.8 0,-3650 5020,0 0,3650 -5020,0" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#505050"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="120.49386"
+ inkscape:cy="175.09957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ borderlayer="true"
+ inkscape:showpageshadow="false"
+ inkscape:window-width="2560"
+ inkscape:window-height="1374"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-bbox="true"
+ inkscape:object-nodes="true" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-796.36218)">
+ <g
+ transform="matrix(630.025,0,0,-458.9,-77.5125,1218.8747)"
+ id="g6197" />
+ <path
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 30.115602,817.66358 197.356268,0 8.00002,11.43214 L 235,1033.6169 l -212.5,0 -0.384417,-204.52118 z"
+ id="rect7653"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccc" />
+ <path
+ style="color:#000000;fill:#ee4055;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 70.934854,870.79411 c -8.818633,0 -15.925195,7.19797 -15.925195,16.13479 l 0,34.39697 c 0,46.31516 24.636814,78.60443 72.990311,78.60443 47.87064,0 72.99037,-32.01415 72.99037,-78.60443 l 0,-34.39697 c 0,-8.93682 -7.1065,-16.13479 -15.92514,-16.13479 z m 90.664866,36.33346 c 2.50474,0 5.01393,0.98537 6.937,2.93364 3.84636,3.89713 3.84636,10.22089 0,14.11802 l -32.84559,33.2774 c -2.11228,2.13974 -4.94066,4.42546 -7.6911,4.21491 -2.7505,0.21336 -5.57882,-2.07517 -7.69116,-4.21491 l -32.845583,-33.2774 c -3.846309,-3.89713 -3.846309,-10.22089 0,-14.11802 1.923126,-1.94827 4.457406,-2.90276 6.967205,-2.90276 2.50986,0 4.98384,0.95449 6.906958,2.90276 l 26.66258,27.01316 26.66252,-27.01316 c 1.92324,-1.94827 4.43236,-2.93364 6.93717,-2.93364 z"
+ id="path4636"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssssssssscssssscss" />
+ <g
+ transform="matrix(5.6146396,0,0,5.6146396,-2740.2871,170.98003)"
+ style="display:inline;enable-background:new"
+ id="g10051">
+ <path
+ style="color:#000000;fill:#75d4a5;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ d="m 493.42485,115 7.57515,0 0,2.03613 -9,0 z"
+ id="rect10035"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="color:#000000;fill:#50b6b1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ d="m 501,115 10,0 0,2.03613 -10.40074,0 z"
+ id="rect10037"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="color:#000000;fill:#e94055;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ d="m 511,115 10,0 0.44526,2.03613 -10.44526,0 z"
+ id="rect10039"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="color:#000000;fill:#e8a945;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+ d="m 521,115 7.57515,0 1.42485,2.03613 -8.59926,0 z"
+ id="rect10041"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
+ </g>
+</svg>