Check-in [a1c4d0960a]
Overview
| Comment: | Experimental Xiph.org JSON API (doesn't work) |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | xiphjson |
| Files: | files | file ages | folders |
| SHA1: |
a1c4d0960a024d6e5e49b92f906df68d |
| User & Date: | mario on 2014-04-27 23:33:05 |
| Other Links: | branch diff | manifest | tags |
Context
|
2014-05-04
| ||
| 02:15 | Utilize caching interface on IO for Xiph.orgΒ΄s JSON API check-in: 4e7851c986 user: mario tags: xiphjson | |
|
2014-04-27
| ||
| 23:33 | Experimental Xiph.org JSON API (doesn't work) check-in: a1c4d0960a user: mario tags: xiphjson | |
| 22:48 | Fully replace ahttp.ajax with ahttp.get() wrapper check-in: b9af78503d user: mario tags: trunk | |
Changes
Modified channels/xiph.py from [04e8c2b58d] to [59dd45edfc].
1 2 3 4 | # # api: streamtuner2 # title: Xiph.org # description: Xiph/ICEcast radio directory | | < < > > | > | | | | > | | 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 |
#
# api: streamtuner2
# title: Xiph.org
# description: Xiph/ICEcast radio directory
# version: 0.2
#
#
# Xiph.org maintains the Ogg streaming standard and Vorbis audio compression
# format, amongst others. The ICEcast server is an alternative to SHOUTcast.
#
# It meanwhile provides a JSOL dump, which is faster to download and process.
# So we'll use that over the older yp.xml. (Sadly it also doesn't output
# homepage URLs, listeners, etc.)
#
#
# streamtuner2 modules
from config import conf
from mygtk import mygtk
import ahttp as http
from channels import *
from config import __print__, dbg
import json
# python modules
import re
#from xml.sax.saxutils import unescape as entity_decode, escape as xmlentities
#import xml.dom.minidom
# I wonder what that is for ---------------------------------------
class xiph (ChannelPlugin):
# desc
api = "streamtuner2"
module = "xiph"
title = "Xiph.org"
version = 0.2
homepage = "http://dir.xiph.org/"
base_url = "http://api.dir.xiph.org/"
json = "experimental/full"
old_yp = "yp.xml"
listformat = "url/http"
config = [
{"name":"xiph_min_bitrate", "value":64, "type":"int", "description":"minimum bitrate, filter anything below", "category":"filter"}
]
# content
categories = ["all", [], ]
|
| ︙ | ︙ | |||
117 118 119 120 121 122 123 |
def update_streams(self, cat, search=""):
# there is actually just a single category to download,
# all else are virtual
if (cat == "all"):
#-- get data
| | > > > > | | | | | | | | | | | | | 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
def update_streams(self, cat, search=""):
# there is actually just a single category to download,
# all else are virtual
if (cat == "all"):
#-- get data
data = http.get(self.base_url + self.json)
data = re.sub('":NaN,', '":0,', data) # the output is JSOL, not valid JSON
data = re.sub('[\\\\]"(?!,)', '\'', data) # and some invalid string escaping
data = re.sub('[\\\\]{1}', '', data) # and all other backslashes to be safe
data = data.decode("latin-1")
#-- extract
l = []
__print__( dbg.DATA, "processing dir.xiph.org/experimental/full JSON" )
for e in json.loads(data):
bitrate = e["bitrate"]
if conf.xiph_min_bitrate and bitrate and bitrate >= int(conf.xiph_min_bitrate):
l.append({
"title": e["stream_name"],
"url": e["listen_url"],
"format": "audio/mpeg",
"bitrate": int(e["bitrate"]),
"channels": e["channels"],
"samplerate": e["samplerate"],
"genre": e["genre"],
"playing": e["current_song"],
"listeners": 0,
"max": 0,
"homepage": "",
})
# filter out a single subtree
else:
rx = re.compile(self.filter.get(cat.lower(), cat.lower()))
l = []
|
| ︙ | ︙ |