[grilo-plugins] metrolyrics: Looks up lyrics with metrolyrics.com



commit 65d5f17d9491ffb0b51242243e6ae1232ce374f7
Author: Victor Toso <me victortoso com>
Date:   Tue Feb 11 23:03:16 2014 -0200

    metrolyrics: Looks up lyrics with metrolyrics.com
    
    If media has Artist and Title keys, look up lyrics on
    metrolyrics.com.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=711243

 src/lua-factory/sources/Makefile.am         |    3 +-
 src/lua-factory/sources/grl-metrolyrics.lua |  105 +++++++++++++++++++++++++++
 2 files changed, 107 insertions(+), 1 deletions(-)
---
diff --git a/src/lua-factory/sources/Makefile.am b/src/lua-factory/sources/Makefile.am
index f540d03..0885cee 100644
--- a/src/lua-factory/sources/Makefile.am
+++ b/src/lua-factory/sources/Makefile.am
@@ -5,7 +5,8 @@
 #
 # Copyright (C) 2013 Victor Toso. All rights reserved.
 
-lua_sources_DATA =
+lua_sources_DATA =                                     \
+       grl-metrolyrics.lua
 
 lua_sourcesdir = $(datadir)/$(LUA_FACTORY_SOURCE_LOCATION)
 
diff --git a/src/lua-factory/sources/grl-metrolyrics.lua b/src/lua-factory/sources/grl-metrolyrics.lua
new file mode 100755
index 0000000..473bf05
--- /dev/null
+++ b/src/lua-factory/sources/grl-metrolyrics.lua
@@ -0,0 +1,105 @@
+--[[
+ * Copyright (C) 2014 Victor Toso.
+ *
+ * Contact: Victor Toso <me victortoso com>
+ *
+ * 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
+ *
+--]]
+
+---------------------------
+-- Source initialization --
+---------------------------
+
+source = {
+  id = "grl-metrolyrics",
+  name = "Metrolyrics",
+  description = "a source for lyrics",
+  supported_keys = { "lyrics" },
+  resolve_keys = {
+    ["type"] = "audio",
+    required = { "artist", "title" },
+  },
+}
+
+netopts = {
+  user_agent = "Grilo Source Metrolyrics/0.2.8",
+}
+
+------------------
+-- Source utils --
+------------------
+
+METROLYRICS_INVALID_URL_CHARS = "[" .. "%(%)%[%]%$%&" .. "]"
+METROLYRICS_DEFAULT_QUERY = "http://www.metrolyrics.com/%s-lyrics-%s.html";
+
+---------------------------------
+-- Handlers of Grilo functions --
+---------------------------------
+
+function grl_source_resolve()
+  local url, req
+  local artist, title
+
+  req = grl.get_media_keys()
+  if not req or not req.artist or not req.title then
+    grl.callback()
+  end
+
+  -- Prepare artist and title strings to the url
+  artist = req.artist:gsub(METROLYRICS_INVALID_URL_CHARS, "")
+  artist = artist:gsub("%s+", "-")
+  title = req.title:gsub(METROLYRICS_INVALID_URL_CHARS, "")
+  title = title:gsub("%s+", "-")
+  url = string.format(METROLYRICS_DEFAULT_QUERY, title, artist)
+  grl.fetch(url, "fetch_page_cb", netopts)
+end
+
+---------------
+-- Utilities --
+---------------
+
+function fetch_page_cb(feed)
+  local media = nil
+  if feed and not feed:find("notfound") then
+    media = metrolyrics_get_lyrics(feed)
+  end
+  grl.callback(media, 0)
+end
+
+function metrolyrics_get_lyrics(feed)
+  local media = {}
+  local res = {}
+  local lyrics_body = '<div class="lyrics%-body">(.-)</div>'
+  local lyrics_verse = "<p class='verse'>(.-)</p>"
+
+  -- from html, get lyrics line by line into table res
+  feed = feed:match(lyrics_body)
+  for verse in feed:gmatch(lyrics_verse) do
+    local start = 1
+    local e, s = verse:find("<br/>")
+    while (e) do
+      res[#res + 1] = verse:sub(start, e-1)
+      start = s+1
+      e, s = verse:find("<br/>", start)
+    end
+    res[#res + 1] = verse:sub(start, #verse) .. '\n\n'
+  end
+
+  -- switch table to string
+  media.lyrics = table.concat(res)
+  return media
+end


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]