|
|
2011-02-14
, 16:27
|
|
|
Posts: 870 |
Thanked: 133 times |
Joined on Aug 2010
|
#631
|
|
|
2011-02-14
, 20:08
|
|
|
Posts: 355 |
Thanked: 205 times |
Joined on Jun 2010
@ Germany
|
#632
|
from storage import Device, File
from com import msgs
from io import Downloader
from utils import logging
from utils import urlquote
from theme import theme
from xml.etree import ElementTree
from cStringIO import StringIO
#_SHOUTCAST_BASE = "http://www.shoutcast.com"
_SHOUTCAST_BASE = "http://api.shoutcast.com"
class ShoutcastDirectory(Device):
"""
Storage device for browsing the SHOUTcast internet radio directory.
"""
CATEGORY = Device.CATEGORY_WAN
TYPE = Device.TYPE_AUDIO
def __init__(self):
# genre list
self.__genres = []
self.__current_folder = None
Device.__init__(self)
def get_prefix(self):
return "iradio-shoutcast://"
def get_name(self):
return "SHOUTcast Radio"
def get_icon(self):
return theme.shoutcast_folder
def __on_add_radio(self, folder, f):
self.emit_message(msgs.IRADIO_ACT_ADD_STATION, f.name, f.resource)
def get_file_actions(self, folder, f):
options = Device.get_file_actions(self, folder, f)
options.append((None, "Add to my Internet Radios", self.__on_add_radio))
return options
def __make_genre(self, genre):
f = File(self)
f.name = genre
f.path = "/" + urlquote.quote(genre, "")
f.mimetype = f.DIRECTORY
f.icon = theme.shoutcast_folder.get_path()
f.folder_flags = f.ITEMS_ENQUEUEABLE
return f
def __make_station(self, s):
try:
name, bitrate, mimetype, location, genre = self.__decode_station(s)
except:
logging.error("error decoding iradio path: %s\n%s",
path, logging.stacktrace())
return None
f = File(self)
f.name = name
f.info = "Bitrate: %s kb" % bitrate
f.resource = location
f.path = "/" + urlquote.quote(genre, "") + "/" + s
f.mimetype = mimetype
f.icon = theme.shoutcast_station.get_path()
return f
def get_file(self, path):
parts = [ p for p in path.split("/") if p ]
len_parts = len(parts)
f = None
if (len_parts == 0):
# root folder
f = File(self)
f.path = "/"
f.mimetype = f.DIRECTORY
f.resource = ""
f.name = self.get_name()
f.info = "Browse the SHOUTcast directory"
f.icon = self.get_icon().get_path()
f.folder_flags = f.ITEMS_ENQUEUEABLE #| f.ITEMS_COMPACT
elif (len_parts == 1):
genre = urlquote.unquote(parts[0])
f = self.__make_genre(genre)
elif (len_parts == 2):
f = self.__make_station(parts[1])
return f
def get_contents(self, folder, begin_at, end_at, cb, *args):
def list_genres():
cnt = 0
for name in self.__genres:
if (cnt < begin_at): continue
if (end_at and cnt > end_at): break
f = self.__make_genre(name)
cb(f, *args)
cnt += 1
#end for
cb(None, *args)
def on_load_genres(d, amount, total, data):
if (d):
data[0] += d
else:
#open("/tmp/shoutcast-genres.html", "w").write(data[0])
self.__genres = self.__parse_genres(data[0])
list_genres()
def on_load_stations(d, amount, total, data, genre):
if (d):
data[0] += d
else:
#open("/tmp/shoutcast-stations.html", "w").write(data[0])
stations = self.__parse_stations(data[0], genre)
cnt = 0
for station in stations:
if (cnt < begin_at): continue
if (end_at and cnt > end_at): break
cb(station, *args)
cnt += 1
#end for
cb(None, *args)
path = folder.path
self.__current_folder = folder
if (not path.endswith("/")): path += "/"
parts = [ p for p in path.split("/") if p ]
len_parts = len(parts)
if (len_parts == 0):
# list genres
if (not self.__genres):
dl = Downloader(_SHOUTCAST_BASE + "/legacy/genrelist?k=fa1669MuiRPorUBw",
on_load_genres, [""])
else:
list_genres()
elif (len_parts == 1):
# list stations
genre = parts[0]
dl = Downloader(_SHOUTCAST_BASE + "/legacy/genresearch?k=fa1669MuiRPorUBw&genre=%s" % genre,
on_load_stations, [""], genre)
def __parse_genres(self, data):
"""
Parses the XML list of genres.
"""
genres = []
try:
dtree = ElementTree.parse(StringIO(data))
for i in dtree.getiterator():
if i.tag == "genre":
for j,n in i.items():
if j == "name":
genres.append(n)
except:
#self.call_service(msgs.UI_ACT_SHOW_INFO,
# "An error occured while loading the list of genres.\n" \
# "Check your internet connection and try again.")
self.__current_folder.message = "genre list not available"
logging.error("SHOUTcast genre listing download failed:\n%s",
logging.stacktrace())
genres.sort()
return genres
def __parse_stations(self, data, genre):
"""
Parses the XML list of stations.
"""
stations = []
try:
dtree = ElementTree.parse(StringIO(data))
for i in dtree.getiterator():
if i.tag == "station":
# build station object
station = File(self)
bitrate = "-"
now_playing = "-"
for j,n in i.items():
if j == "name":
station.name = n
elif j == "ct":
now_playing = n
elif j == "id":
station.resource = "http://yp.shoutcast.com/sbin/tunein-station.pls?id=%s&k=fa1669MuiRPorUBw" % n
elif j == "br":
bitrate = n
elif j == "mt":
station.mimetype = n
station.path = "/" + genre + "/" + \
self.__encode_station(station.name,
bitrate,
station.mimetype,
station.resource,
genre)
station.info = "Bitrate: %s kb\n" \
"Now playing: %s" % (bitrate, now_playing)
station.icon = theme.shoutcast_station.get_path()
stations.append(station)
except:
#self.call_service(msgs.UI_ACT_SHOW_INFO,
# "An error occured while loading the list of stations.\n" \
# "Check your internet connection and try again.")
self.__current_folder.message = "station list not available"
logging.error("SHOUTcast station listing download failed\n%s",
logging.stacktrace())
stations.sort()
return stations
def __encode_station(self, name, bitrate, mimetype, resource, genre):
s = "\t\t\t".join([name, bitrate, mimetype, resource, genre])
return urlquote.quote(s, "")
def __decode_station(self, s):
data = urlquote.unquote(s)
name, bitrate, mimetype, resource, genre = data.split("\t\t\t")
return (name, bitrate, mimetype, resource, genre)
|
|
2011-02-14
, 22:21
|
|
|
Posts: 870 |
Thanked: 133 times |
Joined on Aug 2010
|
#633
|
> File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.022 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.105 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.123 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.198 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.261 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.297 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.376 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.411 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.473 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.498 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.555 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.613 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.731 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.809 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable 2011-02-15 02:18:17.894 - ERROR --- error during service call: FILEINDEX_SVC_DISCOVER > Traceback (most recent call last): > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/com/MessageBus.py", line 105, in call_service > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 415, in handle_FILEINDEX_SVC_DISCOVER > File "/home/builder2/maemo-fremantle-armel-extras-devel/work/mediabox-2010.11.11/debian/mediabox/opt/mediabox/components/fileindex/FileIndex.py", line 155, in discover > TypeError: 'set' object is unindexable
|
|
2011-02-15
, 04:19
|
|
|
Posts: 355 |
Thanked: 205 times |
Joined on Jun 2010
@ Germany
|
#634
|
|
|
2011-02-15
, 04:45
|
|
|
Posts: 870 |
Thanked: 133 times |
Joined on Aug 2010
|
#635
|
|
|
2011-02-15
, 13:22
|
|
Posts: 32 |
Thanked: 24 times |
Joined on Sep 2010
|
#637
|
|
|
2011-02-15
, 23:22
|
|
|
Posts: 870 |
Thanked: 133 times |
Joined on Aug 2010
|
#638
|
|
|
2011-02-20
, 17:15
|
|
|
Posts: 355 |
Thanked: 205 times |
Joined on Jun 2010
@ Germany
|
#639
|
| The Following User Says Thank You to mase For This Useful Post: | ||
|
|
2011-03-14
, 21:43
|
|
|
Posts: 355 |
Thanked: 205 times |
Joined on Jun 2010
@ Germany
|
#640
|
| The Following User Says Thank You to mase For This Useful Post: | ||
![]() |
| Tags |
| mediabox, pycage rules |
| Thread Tools | |
|