Check-in [26b942d018]
Overview
| Comment: | New channel module "iCast.io" as seen in VLC lua scripts. (Quite efficient, but station entries of medium quality.) |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
26b942d018457d981f1927c30b1a0ab4 |
| User & Date: | mario on 2014-05-30 23:22:47 |
| Original Comment: | New channel module "iCast.io" as seen in VLC lua scripts. (Quite efficient, but station entries of medium quality.) |
| Other Links: | manifest | tags |
Context
|
2014-05-31
| ||
| 09:01 | new iTunes Radio stations channel (via RoliSoft Radio Playlist generator API.) check-in: 72fbdf4b92 user: mario tags: trunk | |
|
2014-05-30
| ||
| 23:22 | New channel module "iCast.io" as seen in VLC lua scripts. (Quite efficient, but station entries of medium quality.) check-in: 26b942d018 user: mario tags: trunk | |
| 23:21 | Better cleaup of regex-extracted entries. check-in: a2142151c0 user: mario tags: trunk | |
Changes
Added channels/icast.py version [0e4b7862b4].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 |
# encoding: UTF-8
# api: streamtuner2
# title: iCast
# description: Open collaborative stream directory
# version: 0.1
# type: channel
# category: radio
# priority: optional
# documentation: http://api.icast.io/
#
# A modern alternative to ShoutCast/ICEcast.
# Streams are user-contributed, but often lack meta data (homepage) and
# there's no ordering by listeneres/popularity.
#
# OTOH it's every easy to interface with. Though the repeated API queries
# due to 10-entries-per-query results make fetching slow.
#
#
#
import re
import json
from config import conf, dbg, __print__
from channels import *
import ahttp as http
# Surfmusik sharing site
class icast (ChannelPlugin):
# description
title = "iCast"
module = "icast"
homepage = "http://www.icast.io/"
has_search = True
listformat = "audio/x-scpls"
titles = dict(listeners=False, bitrate=False, playing=False)
categories = []
config = [
]
base = "http://api.icast.io/1/"
# Categories require little post-processing, just dict into list conversion
def update_categories(self):
self.categories = []
for genre,cats in json.loads(http.get(self.base + "genres"))["genres"].items():
self.categories.append(genre.title())
self.categories.append([c.title() for c in cats])
# Just copy over stream URLs and station titles
def update_streams(self, cat, search=None):
if cat:
data = self.api("stations/genre/", cat.lower(), {})
elif search:
data = self.api("stations/search", "", {"q": search})
else:
pass
r = []
for e in data:
r.append(dict(
genre = " ".join(e["genre_list"]),
url = e["streams"][0]["uri"],
format = e["streams"][0]["mime"],
title = e["name"],
#playing = " ".join(e["current"].items()),
))
return r
# fetch multiple pages
def api(self, method, path, params):
r = []
while len(r) < int(conf.max_streams):
data = json.loads(http.get( self.base + method + path, params))
r += data["stations"]
if len(r) >= data["meta"]["total_count"] or len(data["stations"]) < 10:
break
else:
params["page"] = int(data["meta"]["current_page"]) + 1
self.parent.status(params["page"] * 9.5 / float(conf.max_streams))
#__print__(dbg.DATA, data)
return r
|