DELETED contrib/delicast.py
Index: contrib/delicast.py
==================================================================
--- contrib/delicast.py
+++ contrib/delicast.py
@@ -1,103 +0,0 @@
-# encoding: UTF-8
-# api: streamtuner2
-# title: Delicast
-# description: directory of streaming media
-# url: http://delicast.com/
-# version: 0.8
-# type: channel
-# category: radio
-# priority: obsolete
-# config: -
-# png:
-# iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAA
-# AmJLR0QA/4ePzL8AAAAHdElNRQffBB4UJAsX77G0AAAANUlEQVQY02OwQwMMdv/BAEUASCFEoAIIEZIEIGYjBCAUwpb/6O5ACEABGQJ2cFsQIlB3oAEA6iVo+vl+BbQA
-# AAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDQtMzBUMjI6MzY6MDMrMDI6MDAFLUvfAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTA0LTMwVDIyOjM2OjAzKzAyOjAwdHDz
-# YwAAAABJRU5ErkJggg==
-# priority: rare
-# extraction-method: regex, action-handler
-#
-# Just a standard genre/country radio directory. Not very
-# suitable for extraction actually, because it requires a
-# second page request for uncovering the streaming URLs.
-#
-# Audio URL lookup is done in urn_resolve action handler now,
-# so only happens on playback. Which of course won't allow for
-# exporting/bookmarking etc.
-# Now fetches up to 5 pages (20 entries each).
-
-
-import re
-from config import *
-from channels import *
-import ahttp
-import action
-
-
-# Delayed streaming URL discovery
-class delicast (ChannelPlugin):
-
- # control flags
- has_search = False
- listformat = "srv"
- audioformat = "audio/mpeg"
- titles = dict(listeners=False, bitrate=False, playing="Location")
-
- categories = ["60s", "70s", "80s", "90s", "Alternative", "Blues",
- "Chillout", "Christian", "Classical", "Community", "Country", "Culture",
- "Dance", "Disco", "Easy listening", "Electronic", "Folk", "Funk",
- "Gospel", "Hiphop", "House Indie", "Information", "Jazz", "Latin",
- "Lounge", "Love", "Metal", "Oldies", "Pop", "R n b", "Reggae", "Rock",
- "Romantic", "Soul", "Sports", "Student", "Talk", "Techno", "Trance",
- "Urban", "World music"]
-
-
- # static
- def update_categories(self):
- pass
-
-
- # Fetch entries
- def update_streams(self, cat, search=None):
-
- ucat = re.sub("\W+", "-", cat.lower())
- html = ""
- for i in range(1, 5):
- add = ahttp.get("http://delicast.com/radio/q:" + ucat + ("" if i == 1 else "/%s" % i))
- html += add
- if not re.search("href='http://delicast.com/radio/q:%s/%s'" % (ucat, i+1), add):
- break
- r = []
- log.HTML(html)
- for ls in re.findall("""
- \d+\.
- .*?
- ]+href="(http[^"]+/radio/\w+)"
- .*?
- /pics/((?!play_tri)\w+)
- .*?
- 120%'>([^<>]+)
- """, html, re.X|re.S):
- if len(ls):
- homepage, country, title = ls
- r.append(dict(
- homepage = homepage,
- playing = country,
- title = unhtml(title),
- url = "urn:delicast",
- genre = cat,
- # genre = unhtml(tags),
- ))
- return r
-
-
- # Update `url` on station data access (incurs a delay for playing or recording)
- def resolve_urn(self, row):
- if row.get("url").startswith("urn:delicast"):
- html = ahttp.get(row["homepage"])
- ls = re.findall("^var url = \"(.+)\";", html, re.M)
- if ls:
- row["url"] = unhtml(ls[0])
- else:
- log.ERR("No stream found on %s" % row["homepage"])
- return row
-
DELETED contrib/streamlicensing.py
Index: contrib/streamlicensing.py
==================================================================
--- contrib/streamlicensing.py
+++ contrib/streamlicensing.py
@@ -1,110 +0,0 @@
-# encoding: UTF-8
-# api: streamtuner2
-# title: streamlicensing
-# description: Smaller streaming service provider
-# url: http://www.streamlicensing.com/directory/
-# version: 0.2
-# type: channel
-# category: radio
-# priority: obsolete
-# png:
-# iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAGFBMVEVhcAAODy8rLVpHS4RPU22DismUmLTm6va3Zc/ZAAAAAXRSTlMAQObYZgAA
-# AAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfhAgwUMiN14qDwAAAAW0lEQVQI12NggAADCMVW7gym3crBDJb08rJgZbB4
-# qqEQmBGsKMQEZggqMLCA1LAJM8AZaWUQhjpEO5uwamiQMJjBrChkADSlXBhsfHh5qgCYoWysqACxWQlCAwArBw5QNfhFygAAAABJRU5ErkJggg==
-# extraction-method: regex
-#
-# Streaming service provider, which ensures station legality and fees
-# in accordance with US copyright conversion corporations.
-#
-# Has only major categories. Does not provide channel homepages, and
-# is a bit slow due to huge page sizes. No search function implemented
-# here.
-#
-
-
-import re
-import ahttp
-from config import *
-from channels import *
-
-
-# streamlicensing.com
-#
-# · Provides around 20 categories, associated to numeric ids (?g= parameter)
-#
-# · Station lists are one block each, with a JS inline script associating
-# some web player parameters.
-#
-# · Each station has a station id=, but also a stream_id= for the playlist
-# generator.
-#
-# · Normally just provides a web player, but used to show .pls links for various
-# players. Meanwhile this is hidden, but the playlist generator is still
-# available - so doesn't require double lookups.
-# → http://www.streamlicensing.com/directory/index.cgi?action=webpro_links&sid=4785&start=1&g=14&e=1&s=
-# → .../directory/index.cgi/playlist.pls?action=playlist&type=pls&sid=4785&stream_id=1234
-#
-# · family_safe and maxpages are hardcoded config options for now.
-#
-class streamlicensing (ChannelPlugin):
-
- # module attributes
- listformat = "pls"
- has_search = False
- categories = []
- catmap = {}
- titles = dict( listeners=False )
-
- # config (not as plugin options here)
- conf_family_unsafe = 0
- conf_maxpages = max(int(int(conf.max_streams) / 100), 1)
-
- # magic values
- base_url = "http://www.streamlicensing.com/directory/"
- pls_sffx = "%sindex.cgi/playlist.pls?action=playlist&type=pls&sid=%s&stream_id=%s"
-
-
- # fetch category titles and catmap
- def update_categories(self):
- html = ahttp.get(self.base_url)
- cats = re.findall('"\?start=&g=(\d+)&e=&s="><.+?>([\w\s-]+)', html)
- self.categories = sorted([c[1] for c in cats])
- self.catmap = dict([(t,i) for i,t in cats])
-
-
- # extract stream urls
- def update_streams(self, cat):
-
- # prep block regex
- rx_genre = re.compile(r"""
-
([^<]+)(?:span|font|td|a)> .*?
- ^var\slastsong_\d+\s*=\s*'([^\n]+)'; .*?
- ]+onClick=[^>]+&stream_id=(\d+)'[^>]+>(\d+)k<
- """, re.I|re.S|re.X|re.M)
-
- # collect pages into single string
- html = ""
- for page in range(0, self.conf_maxpages):
- self.progress(self.conf_maxpages, page)
- html += ahttp.get("%s?start=%s&g=%s&e=%s&s=" % (self.base_url, page * 10, self.catmap[cat], self.conf_family_unsafe))
- if not re.search("\?start=%s.*>Next" % ((page + 1) * 10), html):
- break
- html = re.sub(">Featured Stations.+?>Previous Page", "", html, 100, re.S)
-
- # extract and convert to station rows
- entries = []
- for uu in re.findall(rx_genre, html):
- print uu
- entries.append(dict(
- genre = cat,
- id = to_int(uu[0]),
- sid = to_int(uu[3]),
- title = unhtml(uu[1]),
- playing = unhtml(uu[2]), # actually JS decoding...
- format = "audio/mpeg",
- bitrate = to_int(uu[4]),
- url = self.pls_sffx % (self.base_url, uu[0], uu[3])
- ))
- return entries
-