Check-in [a763653e6b]
Overview
| Comment: | new plugin: radiolist.net |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
a763653e6bddd75baf8771465dc7ddc4 |
| User & Date: | mario on 2017-02-12 20:57:20 |
| Other Links: | manifest | tags |
Context
|
2017-02-12
| ||
| 20:57 | new plugin: streamlicensing check-in: 82b87725e3 user: mario tags: trunk | |
| 20:57 | new plugin: radiolist.net check-in: a763653e6b user: mario tags: trunk | |
|
2017-01-25
| ||
| 19:15 | Use bold tags for config descriptions instead of Unicode workaround. Group flags by category: basic, extra, verbose to filter out uneeded ones. check-in: 8bcd2bc3d5 user: mario tags: trunk | |
Changes
Added contrib/radiolist.py version [472e976cd7].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# encoding: UTF-8
# api: streamtuner2
# title: radiolist.net
# description: Station list by continent+country
# url: http://radiolist.net/
# version: 0.1
# type: channel
# category: radio
# priority: extra
# png:
# iVBORw0KGgoAAAANSUhEUgAAABgAAAAYBAMAAAASWSDLAAAAFVBMVEVKb61qibyDnMegs9S6yeDV4O37/vyx66abAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEwAACxMB
# AJqcGAAAAAd0SU1FB+ECDBAgLJqgZW4AAADoSURBVBjTNdBNj4MgEAbgqdLeZdo9C5NwFmo5Y7Wedauc1y/+/09YdLskkDwJmZl3IOxnON4A8frQhdc/7mG2cv3gx29X
# rdUfZuVHQ3JHEzZ7GSuNXxFV/FYYwryO6MOiZqEdnQPUC/fsXZaMuxa6MFfOVYN7kIWpHZClyJGLFjbbC617KaRUEJ4r4fU7IqNYrW5f2kgU5gZInG6MZ086eejcyIvO
# 1KwoLayoJjqnuWO5giW8msxVmBQXD5PttSlRm8TG2fDNZS3rRO/opeSCMnPa82xSmNgkfRxJ5yZxlPrPDmLu+7GqX4lERq4G0UEyAAAAAElFTkSuQmCC
# extraction-method: regex
#
# Radio station list grouped by continents and countries.
# Some categories return no results, because web players are
# filtered out.
import re
import ahttp
from config import *
from channels import *
# radiolist.net
class radiolist (ChannelPlugin):
# module attributes
listformat = "pls"
has_search = False
categories = ["Europe", "America", "Canada", "Oceania", "Asia"]
catmap = {"Europe":"", "America":"world", "Canada":"world/canada", "Oceania":"world/oceania", "Asia":"world/asia"}
titles = dict( genre="Genre", title="Station", playing="Location", bitrate="Bitrate", listeners=False )
# just a static list for now
def update_categories(self):
self.catmap = {"Europe":"", "America":"world", "Canada":"world/canada", "Oceania":"world/oceania", "Asia":"world/asia"}
c = []#
rx_links = re.compile(r"""
<td(?:\sstyle="height:\s30px;")?><a\s+href="(?:http://www.radiolist.net)?/([\w/.-]+)">([\w\s-]+)</a>[^<]*</td>
""", re.X)
for title in ["Europe", "America", "Canada", "Oceania", "Asia"]:
c.append(title)
html = ahttp.get("http://www.radiolist.net/" + self.catmap[title])
sub = []
for p,t in re.findall(rx_links, html):
if t in ["Terms", "About Us", "Donation", "United States"]:
continue
sub.append(t)
self.catmap[t] = p
c.append(sorted(sub))
self.categories = c
# extract stream urls
def update_streams(self, cat):
rx_title = re.compile('<a href="([^">]+)" target="_blank">(.+?)</a>', re.I)
rx_urls = re.compile('<a href="([^">]+)">(\d+)(?: Kbps)?</a>', re.I)
rx_genre = re.compile('<td class="cell">([^<]+)</td>', re.I)
entries = []
html = ahttp.get("http://www.radiolist.net/" + self.catmap[cat])
for block in re.findall("<tr>(.+?)</tr>", html, re.S):
ut = re.findall(rx_title, block)
uu = re.findall(rx_urls, block)
lg = re.findall(rx_genre, block)
print ut, uu, lg
if ut and uu and lg:
url, br = self.best_url(uu)
entries.append(dict(
homepage = ut[0][0],
title = unhtml(ut[0][1]),
url = url,
bitrate = br,
format = self.guess_fmt(url),
listformat = self.guess_pls(url),
playing = lg[0],
genre = lg[1]
))
# done
return entries
# pick highest rated URL
def best_url(self, urls):
r = {}
for url, br in urls:
r[url] = to_int(br)
#print "r=", r
best = sorted(r, key=r.get, reverse=True)
#print "best=", best
return best[0], r[best[0]]
# see if audio type can be guessed
def guess_fmt(self, url):
ext = re.findall("mp3|ogg|wma|asx", url)
if ext:
return mime_fmt(ext[0])
else:
return "audio/mpeg"
# guess PLS/M3U from url
def guess_pls(self, url):
ext = re.findall("pls|asx|m3u|srv", url)
if ext:
return ext[0]
else:
return "srv"
|