Ejemplo n.º 1
0
 def loadConfigFile(self):
     print("[AutomaticVolumeAdjustmentConfig] Loading config file...")
     self.config = Config()
     if not os_path.exists(self.CONFIG_FILE):
         try:
             fd = os_open(self.CONFIG_FILE, os_O_RDWR | os_O_CREAT)
             os_close(fd)
         except Exception as e:
             print("Error: ", e)
     try:
         self.config.loadFromFile(self.CONFIG_FILE)
     except Exception as e:
         print("Error: ", e)
     self.config.entriescount = ConfigInteger(0)
     self.config.Entries = ConfigSubList()
     self.config.enable = ConfigYesNo(default=False)
     self.config.modus = ConfigSelection(choices=[
         ("0", _("Automatic volume adjust")),
         ("1", _("Remember service volume value"))
     ],
                                         default="0")
     self.config.adustvalue = ConfigSelectionNumber(-50, 50, 5, default=25)
     self.config.mpeg_max_volume = ConfigSelectionNumber(10,
                                                         100,
                                                         5,
                                                         default=100)
     self.config.show_volumebar = ConfigYesNo(default=False)
     self.initConfig()
	def loadFavoriteConfig(self):
		self.favoriteConfig = Config()
		if os.path.exists(self.FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE)
		else:
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_DEFAULT)
		self.favoriteConfig.entriescount =  ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavouriteConfig()
Ejemplo n.º 3
0
class AutomaticVolumeAdjustmentConfig():
	def __init__(self):
		self.CONFIG_FILE = eEnv.resolve('${sysconfdir}/enigma2/ava_setup.cfg')
		# load config file
		self.loadConfigFile()

	# load config file and initialize
	def loadConfigFile(self):
		print("[AutomaticVolumeAdjustmentConfig] Loading config file...")
		self.config = Config()
		if not os_path.exists(self.CONFIG_FILE):
			try:
				fd = os_open(self.CONFIG_FILE, os_O_RDWR | os_O_CREAT)
				os_close(fd)
			except Exception as e:
				print("Error: ", e)
		try:
			self.config.loadFromFile(self.CONFIG_FILE)
		except Exception as e:
			print("Error: ", e)
		self.config.entriescount = ConfigInteger(0)
		self.config.Entries = ConfigSubList()
		self.config.enable = ConfigYesNo(default=False)
		self.config.modus = ConfigSelection(choices=[("0", _("Automatic volume adjust")), ("1", _("Remember service volume value"))], default="0")
		self.config.adustvalue = ConfigSelectionNumber(-50, 50, 5, default=25)
		self.config.mpeg_max_volume = ConfigSelectionNumber(10, 100, 5, default=100)
		self.config.show_volumebar = ConfigYesNo(default=False)
		self.config.type_audio = ConfigYesNo(default=True)
		self.initConfig()

	def initConfig(self):
		count = self.config.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initEntryConfig()
				i += 1
		print("[AutomaticVolumeAdjustmentConfig] Loaded %s entries from config file..." % count)

	def initEntryConfig(self):
		self.config.Entries.append(ConfigSubsection())
		i = len(self.config.Entries) - 1
		self.config.Entries[i].servicereference = ConfigText(default="")
		self.config.Entries[i].name = NoSave(ConfigDirectory(default=_("Press OK to select a service")))
		self.config.Entries[i].adjustvalue = ConfigSelectionNumber(-50, 50, 5, default=25)
		return self.config.Entries[i]

	def remove(self, configItem):
		self.config.entriescount.value = self.config.entriescount.value - 1
		self.config.entriescount.save()
		self.config.Entries.remove(configItem)
		self.config.Entries.save()
		self.save()

	def save(self):
		print("[AutomaticVolumeAdjustmentConfig] saving config file...")
		self.config.saveToFile(self.CONFIG_FILE)
class AutomaticVolumeAdjustmentConfig():
	def __init__(self):
		self.CONFIG_FILE = '/usr/lib/enigma2/python/Plugins/SystemPlugins/AutomaticVolumeAdjustment/config'
		# load config file
		self.loadConfigFile()

	# load config file and initialize 
	def loadConfigFile(self):
		print "[AutomaticVolumeAdjustmentConfig] Loading config file..."
		self.config = Config()
		if not os_path.exists(self.CONFIG_FILE):
			fd = os_open( self.CONFIG_FILE, os_O_RDWR|os_O_CREAT)
			os_close( fd )
		self.config.loadFromFile(self.CONFIG_FILE)
		self.config.entriescount =  ConfigInteger(0)
		self.config.Entries = ConfigSubList()
		self.config.enable = ConfigYesNo(default = False)
		self.config.modus = ConfigSelection(choices = [("0", _("Automatic volume adjust")), ("1", _("Remember service volume value"))], default = "0")
		self.config.adustvalue = ConfigSelectionNumber(-50, 50, 5, default = 25)
		self.config.mpeg_max_volume = ConfigSelectionNumber(10, 100, 5, default = 100)
		self.config.show_volumebar = ConfigYesNo(default = False)
		self.initConfig()

	def initConfig(self):
		count = self.config.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initEntryConfig()
				i += 1
		print "[AutomaticVolumeAdjustmentConfig] Loaded %s entries from config file..." % count

	def initEntryConfig(self):
		self.config.Entries.append(ConfigSubsection())
		i = len(self.config.Entries) - 1
		self.config.Entries[i].servicereference = ConfigText(default = "")
		self.config.Entries[i].name = NoSave(ConfigDirectory(default = _("Press OK to select a service")))
		self.config.Entries[i].adjustvalue = ConfigSelectionNumber(-50, 50, 5, default = 25)
		return self.config.Entries[i]
	
	def remove(self, configItem):
		self.config.entriescount.value = self.config.entriescount.value - 1
		self.config.entriescount.save()
		self.config.Entries.remove(configItem)
		self.config.Entries.save()
		self.save()
	
	def save(self):
		print "[AutomaticVolumeAdjustmentConfig] saving config file..."
		self.config.saveToFile(self.CONFIG_FILE)
Ejemplo n.º 5
0
class AutomaticVolumeAdjustmentConfig():
	def __init__(self):
		self.CONFIG_FILE = '/usr/lib/enigma2/python/Plugins/Extensions/AutomaticVolumeAdjustment/config'
		# load config file
		self.loadConfigFile()

	# load config file and initialize 
	def loadConfigFile(self):
		print "[AutomaticVolumeAdjustmentConfig] Loading config file..."
		self.config = Config()
		if not os_path.exists(self.CONFIG_FILE):
			fd = os_open( self.CONFIG_FILE, os_O_RDWR|os_O_CREAT)
			os_close( fd )
		self.config.loadFromFile(self.CONFIG_FILE)
		self.config.entriescount =  ConfigInteger(0)
		self.config.Entries = ConfigSubList()
		self.config.enable = ConfigYesNo(default = False)
		self.config.adustvalue = ConfigInteger(default=25, limits=(0,95))
		self.initConfig()

	def initConfig(self):
		count = self.config.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initEntryConfig()
				i += 1
		print "[AutomaticVolumeAdjustmentConfig] Loaded %s entries from config file..." % count

	def initEntryConfig(self):
		self.config.Entries.append(ConfigSubsection())
		i = len(self.config.Entries) - 1
		self.config.Entries[i].servicereference = ConfigText(default = "")
		self.config.Entries[i].name = NoSave(ConfigDirectory(default = _("Press OK to select a service")))
		self.config.Entries[i].adjustvalue = ConfigInteger(default=25, limits=(5,95))
		return self.config.Entries[i]
	
	def remove(self, configItem):
		self.config.entriescount.value = self.config.entriescount.value - 1
		self.config.entriescount.save()
		self.config.Entries.remove(configItem)
		self.config.Entries.save()
		self.save()
	
	def save(self):
		print "[AutomaticVolumeAdjustmentConfig] saving config file..."
		self.config.saveToFile(self.CONFIG_FILE)
 def loadConfigFile(self):
     print "[AutomaticVolumeAdjustmentConfig] Loading config file..."
     self.config = Config()
     if not os_path.exists(self.CONFIG_FILE):
         try:
             fd = os_open(self.CONFIG_FILE, os_O_RDWR | os_O_CREAT)
             os_close(fd)
         except Exception, e:
             print "Error: ", e
Ejemplo n.º 7
0
	def __init__(self, session, action, value, url):
		self.defaultImg = 'Extensions/OnDemand/icons/FolderIcon.png'

		self.showWMA = str(config.ondemand.ShowiRadioWMA.value)
		self.showDefault = str(config.ondemand.ShowTuneinDefault.value)
		self.showIcon = str(config.ondemand.ShowTuneinLogos.value)

		if self.showIcon == 'True':
			if self.showDefault == 'False':
				self.defaultImg = ''

		self.favoriteConfig = Config()
		if os_path.exists(FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(FAVORITE_FILE)

		self.favoriteConfig.entriescount = ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavoriteConfig()
		self.genreList = []
		self.getGenreList(self.genreList)

		self.screenName = "TuneinStreamsThumbCommon"
		StreamsThumbCommon.__init__(self, session, action, value, url, self.screenName)

		self.skin = """
				<screen position="0,0" size="e,e" flags="wfNoBorder" >
					<widget name="lab1" position="0,0" size="e,e" font="Regular;24" halign="center" valign="center" transparent="0" zPosition="5" />
					<widget source="Title" render="Label" position="20,0" size="e,50" font="Regular;32" />
					<widget name="list" position="0,50" size="e,e-50" scrollbarMode="showOnDemand" transparent="1" />
					<ePixmap pixmap="ViX-Common/buttons/green.png" position="800,10" size="40,40" transparent="1" alphatest="on" />
					<widget source="key_green" render="Label" position="810,0" zPosition="1" size="200,40" font="Regular;20" valign="center" halign="center" transparent="1" />
				</screen>"""

		self["key_green"] = StaticText(_("Add to Favorites"))

		self["genreActions"] = ActionMap(["ColorActions"],
		{
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,

		}, -1)
Ejemplo n.º 8
0
	def loadConfigFile(self):
		print "[AutomaticVolumeAdjustmentConfig] Loading config file..."
		self.config = Config()
		if not os_path.exists(self.CONFIG_FILE):
			fd = os_open( self.CONFIG_FILE, os_O_RDWR|os_O_CREAT)
			os_close( fd )
		self.config.loadFromFile(self.CONFIG_FILE)
		self.config.entriescount =  ConfigInteger(0)
		self.config.Entries = ConfigSubList()
		self.config.enable = ConfigYesNo(default = False)
		self.config.adustvalue = ConfigInteger(default=25, limits=(0,95))
		self.initConfig()
	def loadConfigFile(self):
		print "[AutomaticVolumeAdjustmentConfig] Loading config file..."
		self.config = Config()
		if not os_path.exists(self.CONFIG_FILE):
			fd = os_open( self.CONFIG_FILE, os_O_RDWR|os_O_CREAT)
			os_close( fd )
		self.config.loadFromFile(self.CONFIG_FILE)
		self.config.entriescount =  ConfigInteger(0)
		self.config.Entries = ConfigSubList()
		self.config.enable = ConfigYesNo(default = False)
		self.config.modus = ConfigSelection(choices = [("0", _("Automatic volume adjust")), ("1", _("Remember service volume value"))], default = "0")
		self.config.adustvalue = ConfigSelectionNumber(-50, 50, 5, default = 25)
		self.config.mpeg_max_volume = ConfigSelectionNumber(10, 100, 5, default = 100)
		self.config.show_volumebar = ConfigYesNo(default = False)
		self.initConfig()
Ejemplo n.º 10
0
	def setupConfig(self):
		#Streamserver base config
		self.config = Config()
		self.config.streamserver = ConfigSubsection()
		self.config.streamserver.source = ConfigSelection(StreamServerControl.INPUT_MODES, default=str(eStreamServer.INPUT_MODE_LIVE))
		self.config.streamserver.audioBitrate = ConfigInteger(96, StreamServerControl.AUDIO_BITRATE_LIMITS)
		self.config.streamserver.videoBitrate = ConfigInteger(1500, StreamServerControl.VIDEO_BITRATE_LIMITS)
		self.config.streamserver.autoBitrate = ConfigOnOff(default=False)
		self.config.streamserver.resolution = ConfigSelection(list(StreamServerControl.RESOLUTIONS.keys()), default=StreamServerControl.RES_KEY_PAL)
		self.config.streamserver.framerate = ConfigSelection(StreamServerControl.FRAME_RATES, default=StreamServerControl.FRAME_RATE_23_976)
		# extended encoder settings
		self.config.streamserver.gopLength = ConfigInteger(default=eStreamServer.GOP_LENGTH_AUTO, limits=[eStreamServer.GOP_LENGTH_MIN, eStreamServer.GOP_LENGTH_MAX])
		self.config.streamserver.gopOnSceneChange = ConfigOnOff(default=False)
		self.config.streamserver.openGop = ConfigOnOff(default=False)
		self.config.streamserver.bFrames = ConfigInteger(default=eStreamServer.BFRAMES_DEFAULT, limits=[eStreamServer.BFRAMES_MIN, eStreamServer.BFRAMES_MAX])
		self.config.streamserver.pFrames = ConfigInteger(default=eStreamServer.PFRAMES_DEFAULT, limits=[eStreamServer.PFRAMES_MIN, eStreamServer.PFRAMES_MAX])
		self.config.streamserver.slices = ConfigInteger(default=eStreamServer.SLICES_DEFAULT, limits=[eStreamServer.SLICES_MIN, eStreamServer.SLICES_MAX])
		self.config.streamserver.level = ConfigSelection(StreamServerControl.LEVELS, default=str(eStreamServer.LEVEL_DEFAULT))
		self.config.streamserver.profile = ConfigSelection(StreamServerControl.PROFILES, default=str(eStreamServer.PROFILE_DEFAULT))
		#servers
		self.config.streamserver.rtsp = ConfigSubsection()
		self.config.streamserver.rtsp.enabled = ConfigOnOff(default=False)
		self.config.streamserver.rtsp.port = ConfigInteger(554, StreamServerControl.PORT_LIMITS)
		self.config.streamserver.rtsp.path = ConfigText(default="stream", fixed_size=False)
		self.config.streamserver.rtsp.user = ConfigText(default="", fixed_size=False)
		self.config.streamserver.rtsp.password = ConfigPassword(default="")
		self.config.streamserver.hls = ConfigSubsection()
		self.config.streamserver.hls.enabled = ConfigOnOff(default=False)
		self.config.streamserver.hls.path = ConfigText(default="stream", fixed_size=False)
		self.config.streamserver.hls.user = ConfigText(default="", fixed_size=False)
		self.config.streamserver.hls.password = ConfigPassword(default="")
		self.config.streamserver.hls.port = ConfigInteger(8080, StreamServerControl.PORT_LIMITS)
		self.config.streamserver.lastservice = ConfigText(default=config.tv.lastservice.value)
		self.config.streamserver.mediator = ConfigSubsection()
		self.config.streamserver.mediator.enabled = ConfigOnOff(default=False)
		self.config.streamserver.mediator.boxid = ConfigText()
		self.config.streamserver.mediator.boxkey = ConfigText()
		self.config.streamserver.mediator.streaminggroups = ConfigSubsection()
		self.config.streamserver.mediator.streaminggroups.member_alias = ConfigText(default="dreambox", fixed_size=False)
		self.config.streamserver.mediator.streaminggroups.stream_alias = ConfigText(default="", fixed_size=False)
		self.config.streamserver.mediator.streaminggroups.hide_empty = ConfigYesNo(default=False)
		self.config.streamserver.client = ConfigSubsection()
		self.config.streamserver.client.boxid = ConfigText(default="", fixed_size=False)
		self.config.streamserver.client.boxkey = ConfigText(default="", fixed_size=False)

		self.loadConfig()
Ejemplo n.º 11
0
	def __init__(self, session, action, value, url):
		self.defaultImg = 'Extensions/OnDemand/icons/FolderIcon.png'
		
		self.showWMA = str(config.ondemand.ShowiRadioWMA.value)
		self.showDefault = str(config.ondemand.ShowTuneinDefault.value)
		self.showIcon = str(config.ondemand.ShowTuneinLogos.value)

		if self.showIcon == 'True':		
			if self.showDefault == 'False':
				self.defaultImg = ''
			
		self.favoriteConfig = Config()
		if os_path.exists(FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(FAVORITE_FILE)

		self.favoriteConfig.entriescount = ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavoriteConfig()
		self.genreList = []
		self.getGenreList(self.genreList)

		self.screenName = "TuneinStreamsThumbCommon"
		StreamsThumbCommon.__init__(self, session, action, value, url, self.screenName)

		self.skin = """
				<screen position="0,0" size="e,e" flags="wfNoBorder" >
					<widget name="lab1" position="0,0" size="e,e" font="Regular;24" halign="center" valign="center" transparent="0" zPosition="5" />
					<widget source="Title" render="Label" position="20,0" size="e,50" font="Regular;32" />
					<widget name="list" position="0,50" size="e,e-50" scrollbarMode="showOnDemand" transparent="1" />
					<ePixmap pixmap="ViX-Common/buttons/green.png" position="800,10" size="40,40" transparent="1" alphatest="on" />
					<widget source="key_green" render="Label" position="810,0" zPosition="1" size="200,40" font="Regular;20" valign="center" halign="center" transparent="1" />
				</screen>"""

		self["key_green"] = StaticText(_("Add to Favorites"))
		
		self["genreActions"] = ActionMap(["ColorActions"],
		{
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
		
		}, -1)
from Screens.Screen import Screen

from Components.config import Config
from Components.config import ConfigText
from Components.config import ConfigYesNo
from Components.config import getConfigListEntry
from Components.ConfigList import ConfigListScreen
from Components.ActionMap import ActionMap
from Components.Button import Button

from ConfigTextWithSuggestions import ConfigTextWithSuggestions

from . import _

playlistContext = Config()
playlistContext.name = ConfigText(_("Name"), False)
playlistContext.description = ConfigText(_("Description"), False)
playlistContext.private = ConfigYesNo()


class YouTubeAddPlaylistDialog(Screen, ConfigListScreen):
    def __init__(self, session):
        Screen.__init__(self, session)

        self.session = session

        self["actions"] = ActionMap(["YouTubeAddPlaylistActions"], {
            "save": self.keySave,
            "cancel": self.keyCancel
        }, -2)
from Screens.Screen import Screen

from Components.config import config
from Components.config import Config
from Components.config import ConfigSelection
from Components.config import ConfigText
from Components.config import getConfigListEntry
from Components.ConfigList import ConfigListScreen
from Components.ActionMap import ActionMap
from Components.Button import Button

from ConfigTextWithSuggestions import ConfigTextWithSuggestions

from . import _

searchContext = Config()
searchContext.searchTerm = ConfigTextWithSuggestions("", False, threaded = True)
searchContext.orderBy = ConfigSelection(
				[
				 ("relevance", _("Relevance")),
				 ("viewCount", _("View Count")),
				 ("published", _("Published")),
				 ("rating", _("Rating"))
				], "relevance")
searchContext.time = ConfigSelection(
				[
				 ("all_time", _("All Time")),
				 ("this_month", _("This Month")),
				 ("this_week", _("This Week")),
				 ("today", _("Today"))
				], "all_time")
Ejemplo n.º 14
0
class SHOUTcastWidget(Screen):

	GENRELIST = 0
	STATIONLIST = 1
	FAVORITELIST = 2
	SEARCHLIST = 3

	STREAMRIPPER_BIN = '/usr/bin/streamripper'

	SC = 'http://api.shoutcast.com'
	SCY = 'http://yp.shoutcast.com'

	FAVORITE_FILE_DEFAULT = '/usr/lib/enigma2/python/Plugins/Extensions/IniSHOUTcast/favorites'
	FAVORITE_FILE_OLD = '/usr/lib/enigma2/python/Plugins/Extensions/IniSHOUTcast/favorites.user'
	FAVORITE_FILE = '/etc/enigma2/SHOUTcast.favorites'

	sz_w = getDesktop(0).size().width() - 90
	sz_h = getDesktop(0).size().height() - 95
	print "[SHOUTcast] desktop size %dx%d\n" % (sz_w+90, sz_h+100)
	if sz_h < 500:
		sz_h += 4
	skin = """
		<screen name="SHOUTcastWidget" position="center,65" title="SHOUTcast" size="%d,%d">
			<ePixmap position="5,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
			<ePixmap position="150,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
			<ePixmap position="295,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
			<ePixmap position="440,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
			<ePixmap pixmap="skin_default/buttons/key_menu.png" position="585,10" zPosition="0" size="35,25" alphatest="on" />
			<widget render="Label" source="key_red" position="5,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_green" position="150,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_yellow" position="295,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_blue" position="440,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget name="headertext" position="5,47" zPosition="1" size="%d,23" font="Regular;20" transparent="1"  backgroundColor="#00000000"/>
			<widget name="statustext" position="5,240" zPosition="1" size="%d,90" font="Regular;20" halign="center" valign="center" transparent="0"  backgroundColor="#00000000"/>
			<widget name="list" position="5,80" zPosition="2" size="%d,%d" scrollbarMode="showOnDemand" transparent="0"  backgroundColor="#00000000"/>
			<widget name="titel" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="station" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="console" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="cover" zPosition="2" position="5,%d" size="102,110" alphatest="blend" />
			<ePixmap position="%d,41" zPosition="4" size="120,35" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/IniSHOUTcast/shoutcast-logo1-fs8.png" transparent="1" alphatest="on" />
		</screen>""" %(
			sz_w, sz_h, # size
			sz_w - 135, # size headertext
			sz_w - 100, # size statustext
			sz_w - 10, sz_h - 205, # size list
			sz_h - 105, # position titel
			sz_w - 125, # size titel
			sz_h - 70, # position station
			sz_w - 125, # size station
			sz_h - 25, # position console
			sz_w - 125, # size console
			sz_h - 105, # position cover
			sz_w - 125, # position logo
			)
	
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self.oldtitle = None
		self.currentcoverfile = 0
		self.currentGoogle = None
		self.nextGoogle = None
		self.currPlay = None
		self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
		self.session.nav.stopService()
		self.session.nav.event.append(self.__event)
		self["cover"] = Cover()
		self["key_red"] = StaticText(_("Record"))
		self["key_green"] = StaticText(_("Genres"))
		self["key_yellow"] = StaticText(_("Stations"))
		self["key_blue"] = StaticText(_("Favorites"))
		self.mode = self.FAVORITELIST
		self["list"] = SHOUTcastList()
		self["list"].connectSelChanged(self.onSelectionChanged)
		self["statustext"] = Label(_("Getting SHOUTcast genre list..."))
		self["actions"] = ActionMap(["WizardActions", "DirectionActions", "ColorActions", "EPGSelectActions"],
		{
			"ok": self.ok_pressed,
			"back": self.close,
			"menu": self.menu_pressed,
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
			
		}, -1)
		self.stationList = []
		self.stationListIndex = 0
		self.genreList = []
		self.genreListIndex = 0
		self.favoriteList = []
		self.favoriteListIndex = 0

		self.favoriteConfig = Config()
		if os.path.exists(self.FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE)
		elif os.path.exists(self.FAVORITE_FILE_OLD):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_OLD)
		else:
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_DEFAULT)
		self.favoriteConfig.entriescount =  ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavouriteConfig()
		self.stationListXML = ""
		self["titel"] = Label()
		self["station"] = Label()
		self["headertext"] = Label()
		self["console"] = Label()
		self.headerTextString = ""
		self.stationListHeader = ""
		self.tunein = ""
		self.searchSHOUTcastString = ""
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self.stationListURL = ""
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.getFavoriteList)

		self.reloadStationListTimer = eTimer()
		self.reloadStationListTimer.timeout.get().append(self.reloadStationListTimerTimeout)
		self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)

		self.visible = True

		global containerStreamripper
		if containerStreamripper is None:
			containerStreamripper = eConsoleAppContainer()

		containerStreamripper.dataAvail.append(self.streamripperDataAvail)
		containerStreamripper.appClosed.append(self.streamripperClosed)

		if containerStreamripper.running():
			self["key_red"].setText(_("Stop record"))
			# just to hear to recording music when starting the plugin...
			self.currentStreamingStation = _("Recording stream station")
			self.playServiceStream("http://localhost:9191")

	def streamripperClosed(self, retval):
		if retval == 0:
			self["console"].setText("")
		self["key_red"].setText(_("Record"))

	def streamripperDataAvail(self, data):
		sData = data.replace('\n','')
		self["console"].setText(sData)

	def stopReloadStationListTimer(self):
		if self.reloadStationListTimer.isActive():
			self.reloadStationListTimer.stop()

	def reloadStationListTimerTimeout(self):
		self.stopReloadStationListTimer()
		if self.mode == self.STATIONLIST:
			# print "[SHOUTcast] reloadStationList: %s " % self.stationListURL
			sendUrlCommand(self.stationListURL, None,10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def InputBoxStartRecordingCallback(self, returnValue = None):
		if returnValue:
			recordingLength =  int(returnValue) * 60
			if not os.path.exists(config.plugins.shoutcast.dirname.value):
				os.mkdir(config.plugins.shoutcast.dirname.value)
			args = []
			args.append(self.currentStreamingURL)
			args.append('-d')
			args.append(config.plugins.shoutcast.dirname.value)
			args.append('-r')
			args.append('9191')
			if recordingLength != 0:
				args.append('-l')
				args.append("%d" % int(recordingLength))
			if config.plugins.shoutcast.riptosinglefile.value:
				args.append('-a')
				args.append('-A')
			if not config.plugins.shoutcast.createdirforeachstream.value:
				args.append('-s')
			if config.plugins.shoutcast.addsequenceoutputfile.value:
				args.append('-q')
			cmd = [self.STREAMRIPPER_BIN, self.STREAMRIPPER_BIN] + args
			containerStreamripper.execute(*cmd)
			self["key_red"].setText(_("Stop record"))

	def deleteRecordingConfirmed(self,val):
		if val:
			containerStreamripper.sendCtrlC()

	def red_pressed(self):
		if containerStreamripper.running():
			self.session.openWithCallback(self.deleteRecordingConfirmed, MessageBox, _("Do you really want to stop the recording?"))
		else:
			if len(self.currentStreamingURL) != 0:
				self.session.openWithCallback(self.InputBoxStartRecordingCallback, InputBox, windowTitle = _("Recording length"),  title=_("Enter in minutes (0 means unlimited)"), text="0", type=Input.NUMBER)
			else:
				self.session.open(MessageBox, _("Only running streamings can be recorded!"), type = MessageBox.TYPE_INFO,timeout = 20 )

	def green_pressed(self):
		if self.mode != self.GENRELIST:
			self.stopReloadStationListTimer()
			self.mode = self.GENRELIST
		if not self.genreList:
			self.getGenreList()
		else:
			self.showGenreList()

	def yellow_pressed(self):
		if self.mode != self.STATIONLIST:
			if len(self.stationList):
				self.mode = self.STATIONLIST
				self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
				self["headertext"].setText(self.headerTextString)
				self["list"].setMode(self.mode)
				self["list"].setList([ (x,) for x in self.stationList])
				self["list"].moveToIndex(self.stationListIndex)
				if self.reloadStationListTimerVar != 0:
					self.reloadStationListTimer.start(60000 * self.reloadStationListTimerVar)

	def blue_pressed(self):
		if self.mode != self.FAVORITELIST:
			self.stopReloadStationListTimer()
			self.getFavoriteList(self.favoriteListIndex)

	def getFavoriteList(self, favoriteListIndex = 0):
		self["statustext"].setText("")
		self.headerTextString = _("Favorite list")
		self["headertext"].setText(self.headerTextString)
		self.mode = self.FAVORITELIST
		self["list"].setMode(self.mode)
		favoriteList = []
		for item in self.favoriteConfig.Entries:
			favoriteList.append(Favorite(configItem=item))
		self["list"].setList([ (x,) for x in favoriteList])
		if len(favoriteList):
			self["list"].moveToIndex(favoriteListIndex)
		self["list"].show()

	def getGenreList(self, genre = "all" , id = 0):
		self["headertext"].setText("")
		self["statustext"].setText(_("Getting SHOUTcast genre list for %s..." % genre))
		self["list"].hide()
		if len(devid) > 8:
			url = self.SC + "/genre/secondary?parentid=%s&k=%s&f=xml" % (id, devid)
		else:
			url = "http://207.200.98.1/sbin/newxml.phtml"
		sendUrlCommand(url, None,10).addCallback(self.callbackGenreList).addErrback(self.callbackGenreListError)

	def callbackGenreList(self, xmlstring):
		self["headertext"].setText(_("SHOUTcast genre list"))
		self.genreListIndex = 0
		self.mode = self.GENRELIST
		self.genreList = self.fillGenreList(xmlstring)
		self["statustext"].setText("")
		if not len(self.genreList):
			self["statustext"].setText(_("Got 0 genres. Could be a network problem.\nPlease try again..."))
		else:
			self.showGenreList()

	def callbackGenreListError(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(_("%s\nPress green-button to try again...") % str(error.getErrorMessage()))
			except: pass
		
	def fillGenreList(self, xmlstring):
		genreList = []
		# print "[SHOUTcast] fillGenreList\n%s" % xmlstring
		try:
			root = xml.etree.cElementTree.fromstring(xmlstring)
		except: return []
		data = root.find("data")
		if data == None:
			print "[SHOUTcast] could not find data tag, assume flat listing\n"
			return [SHOUTcastGenre(name=childs.get("name")) for childs in root.findall("genre")]
		for glist in data.findall("genrelist"):
			for childs in glist.findall("genre"):
				gn = childs.get("name")
				gid = childs.get("id")
				gparentid = childs.get("parentid")
				ghaschilds = childs.get("haschildren")
				#print "[SHOUTcast] Genre %s id=%s parent=%s haschilds=%s\n" % (gn, gid, gparentid, ghaschilds)
				genreList.append(SHOUTcastGenre(name = gn, id = gid, parentid = gparentid, haschilds = ghaschilds))
				if ghaschilds == "true":
					for childlist in childs.findall("genrelist"):
						for genre in childlist.findall("genre"):
							gn = genre.get("name")
							gid = genre.get("id")
							gparentid = genre.get("parentid")
							ghaschilds = genre.get("haschildren")
							# print "[SHOUTcast]   Genre %s id=%s parent=%s haschilds=%s\n" % (gn, gid, gparentid, ghaschilds)
							genreList.append(SHOUTcastGenre(name = gn, id = gid, parentid = gparentid, haschilds = ghaschilds))
		return genreList

	def showGenreList(self):
		self["headertext"].setText(_("SHOUTcast genre list"))
		self["list"].setMode(self.mode)
		self["list"].setList([ (x,) for x in self.genreList])
		self["list"].moveToIndex(self.genreListIndex)
		self["list"].show()

	def onSelectionChanged(self):
		pass
		# till I find a better solution
#		if self.mode == self.STATIONLIST:
#			self.stationListIndex = self["list"].getCurrentIndex()
#		elif self.mode == self.FAVORITELIST:
#			self.favoriteListIndex = self["list"].getCurrentIndex()
#		elif self.mode == self.GENRELIST:
#			self.genreListIndex = self["list"].getCurrentIndex()

	def ok_pressed(self):
		if self.visible:
			sel = None
			try:
				sel = self["list"].l.getCurrentSelection()[0]
			except:return
			if sel is None:
				return
			else:
				if self.mode == self.GENRELIST:
					self.genreListIndex = self["list"].getCurrentIndex()
					self.getStationList(sel.name)
				elif self.mode == self.STATIONLIST:
					self.stationListIndex = self["list"].getCurrentIndex()
					self.stopPlaying()
					if len(devid) > 8:
						url = self.SCY + "/sbin/tunein-station.pls?id=%s" % (sel.id)
					self["list"].hide()
					self["statustext"].setText(_("Getting streaming data from\n%s") % sel.name)
					self.currentStreamingStation = sel.name
					sendUrlCommand(url, None, 10).addCallback(self.callbackPLS).addErrback(self.callbackStationListError)
				elif self.mode == self.FAVORITELIST:
					self.favoriteListIndex = self["list"].getCurrentIndex()
					if sel.configItem.type.value == "url":
						self.stopPlaying()
						self["headertext"].setText(self.headerTextString)
						self.currentStreamingStation = sel.configItem.name.value
						self.playServiceStream(sel.configItem.text.value)
					elif sel.configItem.type.value == "pls":
						self.stopPlaying()
						url = sel.configItem.text.value
						self["list"].hide()
						self["statustext"].setText(_("Getting streaming data from\n%s") % sel.configItem.name.value)
						self.currentStreamingStation = sel.configItem.name.value
						sendUrlCommand(url, None,10).addCallback(self.callbackPLS).addErrback(self.callbackStationListError)
					elif sel.configItem.type.value == "genre":
						self.getStationList(sel.configItem.name.value)
				elif self.mode == self.SEARCHLIST and self.searchSHOUTcastString != "":
					self.searchSHOUTcast(self.searchSHOUTcastString)
		else:
			self.showWindow()

	def stopPlaying(self):
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self["headertext"].setText("")
		self["titel"].setText("")
		self["station"].setText("")
		self.summaries.setText("")
		if config.plugins.shoutcast.showcover.value:
			self["cover"].doHide()
		self.session.nav.stopService()
		
	def callbackPLS(self, result):
		self["headertext"].setText(self.headerTextString)
		found = False
		parts = string.split(result,"\n")
		for lines in parts:
			if lines.find("File1=") != -1:
				line = string.split(lines,"File1=")
				found = True
				self.playServiceStream(line[-1].rstrip().strip())
				
		if found:
			self["statustext"].setText("")
			self["list"].show()
		else:
			self.currentStreamingStation = ""
			self["statustext"].setText(_("No streaming data found..."))
			self["list"].show()
	def getStationList(self,genre):
		self.stationListHeader = _("genre %s") % genre
		self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
		self["headertext"].setText("")
		self["statustext"].setText(_("Getting %s") %  self.headerTextString)
		self["list"].hide()
		if len(devid) > 8:
			self.stationListURL = self.SC + "/station/advancedsearch&f=xml&k=%s&search=%s" % (devid, genre)
		else:
			self.stationListURL = "http://207.200.98.1/sbin/newxml.phtml?genre=%s" % genre
		self.stationListIndex = 0
		sendUrlCommand(self.stationListURL, None, 10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def callbackStationList(self, xmlstring):
		self.searchSHOUTcastString = ""
		self.stationListXML = xmlstring
		self["headertext"].setText(self.headerTextString)
		self.mode = self.STATIONLIST
		self["list"].setMode(self.mode)
		self.stationList = self.fillStationList(xmlstring)
		self["statustext"].setText("")
		self["list"].setList([ (x,) for x in self.stationList])
		if len(self.stationList):
			self["list"].moveToIndex(self.stationListIndex)
		self["list"].show()
		if self.reloadStationListTimerVar != 0:
			self.reloadStationListTimer.start(1000 * 60)

	def fillStationList(self,xmlstring):
		stationList = []
		try:
			root = xml.etree.cElementTree.fromstring(xmlstring)
		except: return []
		config_bitrate = int(config.plugins.shoutcast.streamingrate.value)
		data = root.find("data")
		if data == None:
			print "[SHOUTcast] could not find data tag\n"
			return []
		for slist in data.findall("stationlist"):
			for childs in slist.findall("tunein"):
				self.tunein = childs.get("base")
			for childs in slist.findall("station"):
				try: bitrate = int(childs.get("br"))
				except: bitrate = 0
				if bitrate >= config_bitrate:
					stationList.append(SHOUTcastStation(name = childs.get("name"), 
									mt = childs.get("mt"), id = childs.get("id"), br = childs.get("br"), 
									genre = childs.get("genre"), ct = childs.get("ct"), lc = childs.get("lc"), ml = childs.get("ml"), nsc = childs.get("nsc"),
									cst = childs.get("cst")))
		return stationList

	def menu_pressed(self):
		if not self.visible:
			self.showWindow()
		options = [(_("Config"), self.config),(_("Search"), self.search),]
		if self.mode == self.FAVORITELIST and self.getSelectedItem() is not None:
			options.extend(((_("rename current selected favorite"), self.renameFavorite),))
			options.extend(((_("remove current selected favorite"), self.removeFavorite),))
		elif self.mode == self.GENRELIST and self.getSelectedItem() is not None:
			options.extend(((_("Add current selected genre to favorite"), self.addGenreToFavorite),))
		elif self.mode == self.STATIONLIST and self.getSelectedItem() is not None:
			options.extend(((_("Add current selected station to favorite"), self.addStationToFavorite),))
		if len(self.currentStreamingURL) != 0:
			options.extend(((_("Add current playing stream to favorite"), self.addCurrentStreamToFavorite),))
		options.extend(((_("Hide"), self.hideWindow),))
		self.session.openWithCallback(self.menuCallback, ChoiceBox,list = options)

	def menuCallback(self, ret):
		ret and ret[1]()

	def hideWindow(self):
		self.visible = False
		self.hide()

	def showWindow(self):
		self.visible = True
		self.show()

	def addGenreToFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.addFavorite(name = sel.name, text = sel.name, favoritetype = "genre")			

	def addStationToFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.addFavorite(name = sel.name, text = self.SCY + "/sbin/tunein-station.pls?id=%s" % (sel.id), favoritetype = "pls", audio = sel.mt, bitrate = sel.br)			

	def addCurrentStreamToFavorite(self):
		self.addFavorite(name = self.currentStreamingStation, text = self.currentStreamingURL, favoritetype = "url")

	def addFavorite(self, name = "", text = "", favoritetype = "", audio = "", bitrate = ""):
		self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
		self.favoriteConfig.entriescount.save()
		newFavorite = self.initFavouriteEntryConfig()
		newFavorite.name.value = name
		newFavorite.text.value = text
		newFavorite.type.value = favoritetype
		newFavorite.audio.value = audio
		newFavorite.bitrate.value = bitrate
		newFavorite.save()
		self.favoriteConfig.saveToFile(self.FAVORITE_FILE)

	def renameFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.session.openWithCallback(self.renameFavoriteFinished, VirtualKeyBoard, title = _("Enter new name for favorite item"), text = sel.configItem.name.value)

	def renameFavoriteFinished(self, text = None):
		if text:
			sel = self.getSelectedItem()
			sel.configItem.name.value = text
			sel.configItem.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)
			self.favoriteListIndex = 0
			self.getFavoriteList()


	def removeFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value - 1
			self.favoriteConfig.entriescount.save()
			self.favoriteConfig.Entries.remove(sel.configItem)
			self.favoriteConfig.Entries.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)
			self.favoriteListIndex = 0
			self.getFavoriteList()

	def search(self):
		self.session.openWithCallback(self.searchSHOUTcast, VirtualKeyBoard, title = _("Enter text to search for"))

	def searchSHOUTcast(self, searchstring = None):
		if searchstring:
			self.stopReloadStationListTimer()
			self.stationListHeader = _("search-criteria %s") % searchstring
			self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
			self["headertext"].setText("")
			self["statustext"].setText(_("Searching SHOUTcast for %s...") % searchstring)
			self["list"].hide()
			if len(devid) > 8:
			   self.stationListURL = self.SC + "/station/advancedsearch&f=xml&k=%s&search=%s" % (devid, searchstring)
			else:
			   self.stationListURL = "http://207.200.98.1/sbin/newxml.phtml?search=%s" % searchstring
			self.mode = self.SEARCHLIST
			self.searchSHOUTcastString = searchstring
			self.stationListIndex = 0
			sendUrlCommand(self.stationListURL, None, 10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def config(self):
		self.stopReloadStationListTimer()
		self.session.openWithCallback(self.setupFinished, SHOUTcastSetup)

	def setupFinished(self, result):
		if result:
			if config.plugins.shoutcast.showcover.value:
				self["cover"].doShow()
			else:
				self["cover"].doHide()
			if self.mode == self.STATIONLIST:
				self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)
				self.stationListIndex = 0
				self.callbackStationList(self.stationListXML)

	def callbackStationListError(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(_("%s\nPress OK to try again...") % str(error.getErrorMessage()))
			except: pass

	def Error(self, error = None):
		if error is not None:
			# print "[SHOUTcast] Error: %s\n" % error
			try:
				self["list"].hide()
				self["statustext"].setText(str(error.getErrorMessage()))
			except: pass
		if self.nextGoogle:
			self.currentGoogle = self.nextGoogle
			self.nextGoogle = None
			sendUrlCommand(self.currentGoogle, None, 10).addCallback(self.GoogleImageCallback).addErrback(self.Error)
		else:
			self.currentGoogle = None
	
	def __onClose(self):
		global coverfiles
		for f in coverfiles:
			try:
				os.unlink(f)
			except:
				pass
		self.stopReloadStationListTimer()
		self.session.nav.playService(self.CurrentService)
		self.session.nav.event.remove(self.__event)
		self.currPlay = None
		containerStreamripper.dataAvail.remove(self.streamripperDataAvail)
		containerStreamripper.appClosed.remove(self.streamripperClosed)

	def GoogleImageCallback(self, result):
		global coverfiles
		if self.nextGoogle:
			self.currentGoogle = self.nextGoogle
			self.nextGoogle = None
			sendUrlCommand(self.currentGoogle, None, 10).addCallback(self.GoogleImageCallback).addErrback(self.Error)
			return
		self.currentGoogle = None
		foundPos = result.find("unescapedUrl\":\"")
		foundPos2 = result.find("\",\"url\":\"")
		if foundPos != -1 and foundPos2 != -1:
			url=result[foundPos+15:foundPos2]
			if len(url)>15:
				url= url.replace(" ", "%20")
				print "download url: %s " % url
				validurl = True
			else:
				validurl = False
				print "[SHOUTcast] invalid cover url or pictureformat!"
				if config.plugins.shoutcast.showcover.value:
					self["cover"].doHide()
			if validurl:
				self.currentcoverfile = (self.currentcoverfile + 1) % len(coverfiles)
				try:
					os.unlink(coverfiles[self.currentcoverfile-1])
				except:
					pass
				coverfile = coverfiles[self.currentcoverfile]
				print "[SHOUTcast] downloading cover from %s to %s" % (url, coverfile)
				downloadPage(url, coverfile).addCallback(self.coverDownloadFinished, coverfile).addErrback(self.coverDownloadFailed)

	def coverDownloadFailed(self,result):
		print "[SHOUTcast] cover download failed:", result
		if config.plugins.shoutcast.showcover.value:
			self["statustext"].setText(_("Error downloading cover..."))
			self["cover"].doHide()

	def coverDownloadFinished(self, result, coverfile):
		if config.plugins.shoutcast.showcover.value:
			print "[SHOUTcast] cover download finished:", coverfile
			self["statustext"].setText("")
			self["cover"].updateIcon(coverfile)
			self["cover"].doShow()
		
	def __event(self, ev):
		if ev != 17:
			print "[SHOUTcast] EVENT ==>", ev
		if ev == 1 or ev == 4:
			print "[SHOUTcast] Tuned in, playing now!"
		if ev == 3 or ev == 7:
			self["statustext"].setText(_("Stream stopped playing, playback of stream stopped!"))
			print "[SHOUTcast] Stream stopped playing, playback of stream stopped!"
			self.session.nav.stopService()
		if ev == 5:
			if not self.currPlay:
				return
			sTitle = self.currPlay.info().getInfoString(iServiceInformation.sTagTitle)
			if self.oldtitle != sTitle:
				self.oldtitle=sTitle
				sTitle = sTitle.replace("Title:", "")[:55]
				if config.plugins.shoutcast.showcover.value:
					searchpara="album cover "
					if sTitle:
						url = "http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=%s%s&biw=%s&bih=%s&ift=jpg&ift=gif&ift=png" % (quote(searchpara), quote(sTitle), config.plugins.shoutcast.coverwidth.value, config.plugins.shoutcast.coverheight.value)
					else:
						url = "http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=no+cover+pic&biw=%s&bih=%s&ift=jpg&ift=gif&ift=png" % (config.plugins.shoutcast.coverwidth.value, config.plugins.shoutcast.coverheight.value)
					print "[SHOUTcast] coverurl = %s " % url
					if self.currentGoogle:
						self.nextGoogle = url
					else:
						self.currentGoogle = url
						sendUrlCommand(url, None, 10).addCallback(self.GoogleImageCallback).addErrback(self.Error)
				if len(sTitle) == 0:
					sTitle = "n/a"
				title = _("Title: %s") % sTitle
				print "[SHOUTcast] Title: %s " % title
				self["titel"].setText(title)
				self.summaries.setText(title)
			else:
				print "[SHOUTcast] Ignoring useless updated info provided by streamengine!"
		#if ev == 6 or (ev > 8 and ev != 17):
		#	print "[SHOUTcast] Abnormal event %s from stream, so stop playing!" % ev
		#	self["statustext"].setText(_("Abnormal event from stream, aborting!"))
		#	self.session.nav.stopService()
			
	def playServiceStream(self, url):
		self.currPlay = None
		self.session.nav.stopService()
		if config.plugins.shoutcast.showcover.value:
			self["cover"].doHide()
		sref = eServiceReference("4097:0:0:0:0:0:0:0:0:0:%s" % url.replace(':', '%3a'))
		try:
			self.session.nav.playService(sref)
		except:
			print "[SHOUTcast] Could not play %s" % sref
		self.currPlay = self.session.nav.getCurrentService()
		self.currentStreamingURL = url
		self["titel"].setText(_("Title: n/a"))
		self["station"].setText(_("Station: %s") % self.currentStreamingStation)

	def createSummary(self):
		return SHOUTcastLCDScreen

	def initFavouriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) -1
		self.favoriteConfig.Entries[i].name = ConfigText(default = "")
		self.favoriteConfig.Entries[i].text = ConfigText(default = "")
		self.favoriteConfig.Entries[i].type = ConfigText(default = "")
		self.favoriteConfig.Entries[i].audio = ConfigText(default = "")
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default = "")
		return self.favoriteConfig.Entries[i]

	def initFavouriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavouriteEntryConfig()
				i += 1

	def getSelectedItem(self):
		sel = None
		try:
			sel = self["list"].l.getCurrentSelection()[0]
		except:return None
		return sel
Ejemplo n.º 15
0
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self.oldtitle = None
		self.currentcoverfile = 0
		self.currentGoogle = None
		self.nextGoogle = None
		self.currPlay = None
		self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
		self.session.nav.stopService()
		self.session.nav.event.append(self.__event)
		self["cover"] = Cover()
		self["key_red"] = StaticText(_("Record"))
		self["key_green"] = StaticText(_("Genres"))
		self["key_yellow"] = StaticText(_("Stations"))
		self["key_blue"] = StaticText(_("Favorites"))
		self.mode = self.FAVORITELIST
		self["list"] = SHOUTcastList()
		self["list"].connectSelChanged(self.onSelectionChanged)
		self["statustext"] = Label(_("Getting SHOUTcast genre list..."))
		self["actions"] = ActionMap(["WizardActions", "DirectionActions", "ColorActions", "EPGSelectActions"],
		{
			"ok": self.ok_pressed,
			"back": self.close,
			"menu": self.menu_pressed,
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
			
		}, -1)
		self.stationList = []
		self.stationListIndex = 0
		self.genreList = []
		self.genreListIndex = 0
		self.favoriteList = []
		self.favoriteListIndex = 0

		self.favoriteConfig = Config()
		if os.path.exists(self.FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE)
		elif os.path.exists(self.FAVORITE_FILE_OLD):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_OLD)
		else:
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_DEFAULT)
		self.favoriteConfig.entriescount =  ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavouriteConfig()
		self.stationListXML = ""
		self["titel"] = Label()
		self["station"] = Label()
		self["headertext"] = Label()
		self["console"] = Label()
		self.headerTextString = ""
		self.stationListHeader = ""
		self.tunein = ""
		self.searchSHOUTcastString = ""
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self.stationListURL = ""
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.getFavoriteList)

		self.reloadStationListTimer = eTimer()
		self.reloadStationListTimer.timeout.get().append(self.reloadStationListTimerTimeout)
		self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)

		self.visible = True

		global containerStreamripper
		if containerStreamripper is None:
			containerStreamripper = eConsoleAppContainer()

		containerStreamripper.dataAvail.append(self.streamripperDataAvail)
		containerStreamripper.appClosed.append(self.streamripperClosed)

		if containerStreamripper.running():
			self["key_red"].setText(_("Stop record"))
			# just to hear to recording music when starting the plugin...
			self.currentStreamingStation = _("Recording stream station")
			self.playServiceStream("http://localhost:9191")
class InternetRadioFavoriteConfig(object):
	FAVORITE_FILE_DEFAULT =  eEnv.resolve('${libdir}/enigma2/python/Plugins/Extensions/InternetRadio/internetradio_favorites') #'/usr/lib/enigma2/python/Plugins/Extensions/InternetRadio/internetradio_favorites'
	FAVORITE_FILE = eEnv.resolve("${sysconfdir}/enigma2/internetradio_favorites.user") #'/etc/enigma2/internetradio_favorites.user'
	def __init__(self):
		self.loadFavoriteConfig()

	def loadFavoriteConfig(self):
		self.favoriteConfig = Config()
		if os.path.exists(self.FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE)
		else:
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_DEFAULT)
		self.favoriteConfig.entriescount =  ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavouriteConfig()

	def initFavouriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) -1
		self.favoriteConfig.Entries[i].name = ConfigText(default = "")
		self.favoriteConfig.Entries[i].text = ConfigText(default = "")
		self.favoriteConfig.Entries[i].type = ConfigInteger(0)
		self.favoriteConfig.Entries[i].tags = ConfigText(default = "")
		self.favoriteConfig.Entries[i].country = ConfigText(default = "")
		self.favoriteConfig.Entries[i].homepage = ConfigText(default = "")
		return self.favoriteConfig.Entries[i]

	def initFavouriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavouriteEntryConfig()
				i += 1

	def addFavorite(self, name = "", text = "", favoritetype = "", tags = "", country = "", homepage = ""):
		self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
		self.favoriteConfig.entriescount.save()
		newFavorite = self.initFavouriteEntryConfig()
		newFavorite.name.value = name
		newFavorite.text.value = text
		newFavorite.type.value = favoritetype
		newFavorite.tags.value = tags
		newFavorite.country.value = country
		newFavorite.homepage.value = homepage
		newFavorite.save()
		self.favoriteConfig.saveToFile(self.FAVORITE_FILE)

	def renameFavorite(self, configItem, name, text=None):
			configItem.name.value = name
			if text is not None:
				configItem.text.value = text
			configItem.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)

	def removeFavorite(self, configItem):
		if configItem is not None:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value - 1
			self.favoriteConfig.entriescount.save()
			self.favoriteConfig.Entries.remove(configItem)
			self.favoriteConfig.Entries.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)

	def removeFavoriteHTML(self, name, text, favoritetype):
		result = 0
		for item in self.favoriteConfig.Entries:
			if item.name.value == name and item.text.value == text and item.type.value == favoritetype:
				result = 1
				self.removeFavorite(item)
				break
		return result

	def renameFavoriteHTML(self, name, text, favoritetype, newname, newtext=None):
		result = 0
		for item in self.favoriteConfig.Entries:
			if item.name.value == name and item.text.value == text and item.type.value == favoritetype:
				result = 1
				self.renameFavorite(item, newname, newtext)
				break
		return result

	def getFavoriteList(self, html = False):
		favoriteList = []
		for item in self.favoriteConfig.Entries:
			if html == True:
				favoriteList.append((item.name.value, item.text.value, item.type.value, item.tags.value, item.country.value, item.homepage.value))
			else:
				favoriteList.append(((Favorite(item)),))
		return favoriteList
Ejemplo n.º 17
0
class SHOUTcastWidget(Screen):

	GENRELIST = 0
	STATIONLIST = 1
	FAVORITELIST = 2
	SEARCHLIST = 3

	STREAMRIPPER_BIN = '/usr/bin/streamripper'

	SC = 'http://api.shoutcast.com'
	SCY = 'http://yp.shoutcast.com'

	FAVORITE_FILE_DEFAULT = '/usr/lib/enigma2/python/Plugins/Extensions/IniSHOUTcast/favorites'
	FAVORITE_FILE_OLD = '/usr/lib/enigma2/python/Plugins/Extensions/IniSHOUTcast/favorites.user'
	FAVORITE_FILE = '/etc/enigma2/SHOUTcast.favorites'

	sz_w = getDesktop(0).size().width() - 90
	sz_h = getDesktop(0).size().height() - 95
	print "[SHOUTcast] Desktop size %dx%d" % (sz_w+90, sz_h+95)
	if sz_h < 500:
		sz_h += 4
	skin = """
		<screen name="SHOUTcastWidget" position="center,65" title="SHOUTcast" size="%d,%d">
			<ePixmap position="5,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
			<ePixmap position="150,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
			<ePixmap position="295,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
			<ePixmap position="440,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
			<ePixmap pixmap="skin_default/buttons/key_menu.png" position="585,10" zPosition="0" size="35,25" alphatest="on" />
			<widget render="Label" source="key_red" position="5,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_green" position="150,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_yellow" position="295,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_blue" position="440,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget name="headertext" position="5,47" zPosition="1" size="%d,23" font="Regular;20" transparent="1"  backgroundColor="#00000000"/>
			<widget name="statustext" position="5,240" zPosition="1" size="%d,90" font="Regular;20" halign="center" valign="center" transparent="0"  backgroundColor="#00000000"/>
			<widget name="list" position="5,80" zPosition="2" size="%d,%d" scrollbarMode="showOnDemand" transparent="0"  backgroundColor="#00000000"/>
			<widget name="titel" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="station" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="console" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="cover" zPosition="2" position="5,%d" size="102,110" alphatest="blend" />
			<ePixmap position="%d,41" zPosition="4" size="120,35" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/IniSHOUTcast/shoutcast-logo1-fs8.png" transparent="1" alphatest="on" />
		</screen>""" %(
			sz_w, sz_h, # size
			sz_w - 135, # size headertext
			sz_w - 100, # size statustext
			sz_w - 10, sz_h - 205, # size list
			sz_h - 105, # position titel
			sz_w - 125, # size titel
			sz_h - 70, # position station
			sz_w - 125, # size station
			sz_h - 25, # position console
			sz_w - 125, # size console
			sz_h - 105, # position cover
			sz_w - 125, # position logo
			)
	
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self.oldtitle = None
		self.currentcoverfile = 0
		self.currentGoogle = None
		self.nextGoogle = None
		self.currPlay = None
		self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
		self.session.nav.stopService()
		self.session.nav.event.append(self.__event)
		self["cover"] = Cover()
		self["key_red"] = StaticText(_("Record"))
		self["key_green"] = StaticText(_("Genres"))
		self["key_yellow"] = StaticText(_("Stations"))
		self["key_blue"] = StaticText(_("Favorites"))
		self.mode = self.FAVORITELIST
		self["list"] = SHOUTcastList()
		self["list"].connectSelChanged(self.onSelectionChanged)
		self["statustext"] = Label(_("Getting SHOUTcast genre list..."))
		self["actions"] = ActionMap(["WizardActions", "DirectionActions", "ColorActions", "EPGSelectActions"],
		{
			"ok": self.ok_pressed,
			"back": self.close,
			"menu": self.menu_pressed,
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
			
		}, -1)
		self.stationList = []
		self.stationListIndex = 0
		self.genreList = []
		self.genreListIndex = 0
		self.favoriteList = []
		self.favoriteListIndex = 0

		self.favoriteConfig = Config()
		if os.path.exists(self.FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE)
		elif os.path.exists(self.FAVORITE_FILE_OLD):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_OLD)
		else:
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_DEFAULT)
		self.favoriteConfig.entriescount =  ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavouriteConfig()
		self.stationListXML = ""
		self["titel"] = Label()
		self["station"] = Label()
		self["headertext"] = Label()
		self["console"] = Label()
		self.headerTextString = ""
		self.stationListHeader = ""
		self.tunein = ""
		self.searchSHOUTcastString = ""
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self.stationListURL = ""
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.getFavoriteList)

		self.reloadStationListTimer = eTimer()
		self.reloadStationListTimer.timeout.get().append(self.reloadStationListTimerTimeout)
		self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)

		self.visible = True

		global containerStreamripper
		if containerStreamripper is None:
			containerStreamripper = eConsoleAppContainer()

		containerStreamripper.dataAvail.append(self.streamripperDataAvail)
		containerStreamripper.appClosed.append(self.streamripperClosed)

		if containerStreamripper.running():
			self["key_red"].setText(_("Stop record"))
			# just to hear to recording music when starting the plugin...
			self.currentStreamingStation = _("Recording stream station")
			self.playServiceStream("http://localhost:9191")

	def streamripperClosed(self, retval):
		if retval == 0:
			self["console"].setText("")
		self["key_red"].setText(_("Record"))

	def streamripperDataAvail(self, data):
		sData = data.replace('\n','')
		self["console"].setText(sData)

	def stopReloadStationListTimer(self):
		if self.reloadStationListTimer.isActive():
			self.reloadStationListTimer.stop()

	def reloadStationListTimerTimeout(self):
		self.stopReloadStationListTimer()
		if self.mode == self.STATIONLIST:
			# print "[SHOUTcast] reloadStationList: %s" % self.stationListURL
			sendUrlCommand(self.stationListURL, None,10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def InputBoxStartRecordingCallback(self, returnValue = None):
		if returnValue:
			recordingLength =  int(returnValue) * 60
			if not os.path.exists(config.plugins.shoutcast.dirname.value):
				os.mkdir(config.plugins.shoutcast.dirname.value)
			args = []
			args.append(self.currentStreamingURL)
			args.append('-d')
			args.append(config.plugins.shoutcast.dirname.value)
			args.append('-r')
			args.append('9191')
			args.append('-u')
			args.append('Enigma2 HbbTV/1.1.1 (+PVR+RTSP+DL;Beyonwiz;;;)')
			if recordingLength != 0:
				args.append('-l')
				args.append("%d" % int(recordingLength))
			if config.plugins.shoutcast.riptosinglefile.value:
				args.append('-a')
				args.append('-A')
			if not config.plugins.shoutcast.createdirforeachstream.value:
				args.append('-s')
			if config.plugins.shoutcast.addsequenceoutputfile.value:
				args.append('-q')
			cmd = [self.STREAMRIPPER_BIN, self.STREAMRIPPER_BIN] + args
			containerStreamripper.execute(*cmd)
			self["key_red"].setText(_("Stop record"))

	def deleteRecordingConfirmed(self,val):
		if val:
			containerStreamripper.sendCtrlC()

	def red_pressed(self):
		if containerStreamripper.running():
			self.session.openWithCallback(self.deleteRecordingConfirmed, MessageBox, _("Do you really want to stop the recording?"))
		else:
			if len(self.currentStreamingURL) != 0:
				self.session.openWithCallback(self.InputBoxStartRecordingCallback, InputBox, windowTitle = _("Recording length"),  title=_("Enter in minutes (0 means unlimited)"), text="0", type=Input.NUMBER)
			else:
				self.session.open(MessageBox, _("Only running streamings can be recorded!"), type = MessageBox.TYPE_INFO,timeout = 20 )

	def green_pressed(self):
		if self.mode != self.GENRELIST:
			self.stopReloadStationListTimer()
			self.mode = self.GENRELIST
		if not self.genreList:
			self.getGenreList()
		else:
			self.showGenreList()

	def yellow_pressed(self):
		if self.mode != self.STATIONLIST:
			if len(self.stationList):
				self.mode = self.STATIONLIST
				self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
				self["headertext"].setText(self.headerTextString)
				self["list"].setMode(self.mode)
				self["list"].setList([ (x,) for x in self.stationList])
				self["list"].moveToIndex(self.stationListIndex)
				if self.reloadStationListTimerVar != 0:
					self.reloadStationListTimer.start(60000 * self.reloadStationListTimerVar)

	def blue_pressed(self):
		if self.mode != self.FAVORITELIST:
			self.stopReloadStationListTimer()
			self.getFavoriteList(self.favoriteListIndex)

	def getFavoriteList(self, favoriteListIndex = 0):
		self["statustext"].setText("")
		self.headerTextString = _("Favorite list")
		self["headertext"].setText(self.headerTextString)
		self.mode = self.FAVORITELIST
		self["list"].setMode(self.mode)
		favoriteList = []
		for item in self.favoriteConfig.Entries:
			favoriteList.append(Favorite(configItem=item))
		self["list"].setList([ (x,) for x in favoriteList])
		if len(favoriteList):
			self["list"].moveToIndex(favoriteListIndex)
		self["list"].show()

	def getGenreList(self, genre = "all" , id = 0):
		self["headertext"].setText("")
		self["statustext"].setText(_("Getting SHOUTcast genre list for %s..." % genre))
		self["list"].hide()
		if len(devid) > 8:
			url = self.SC + "/genre/secondary?parentid=%s&k=%s&f=xml" % (id, devid)
		else:
			url = "http://207.200.98.1/sbin/newxml.phtml"
		sendUrlCommand(url, None,10).addCallback(self.callbackGenreList).addErrback(self.callbackGenreListError)

	def callbackGenreList(self, xmlstring):
		self["headertext"].setText(_("SHOUTcast genre list"))
		self.genreListIndex = 0
		self.mode = self.GENRELIST
		self.genreList = self.fillGenreList(xmlstring)
		self["statustext"].setText("")
		if not len(self.genreList):
			self["statustext"].setText(_("Got 0 genres. Could be a network problem.\nPlease try again..."))
		else:
			self.showGenreList()

	def callbackGenreListError(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(_("%s\nPress green-button to try again...") % str(error.getErrorMessage()))
			except: pass
		
	def fillGenreList(self, xmlstring):
		genreList = []
		# print "[SHOUTcast] fillGenreList: %s" % xmlstring
		try:
			root = xml.etree.cElementTree.fromstring(xmlstring)
		except: return []
		data = root.find("data")
		if data == None:
			print "[SHOUTcast] Could not find data tag, assume flat listing!"
			return [SHOUTcastGenre(name=childs.get("name")) for childs in root.findall("genre")]
		for glist in data.findall("genrelist"):
			for childs in glist.findall("genre"):
				gn = childs.get("name")
				gid = childs.get("id")
				gparentid = childs.get("parentid")
				ghaschilds = childs.get("haschildren")
				# print "[SHOUTcast] Genre %s id=%s parent=%s haschilds=%s" % (gn, gid, gparentid, ghaschilds)
				genreList.append(SHOUTcastGenre(name = gn, id = gid, parentid = gparentid, haschilds = ghaschilds))
				if ghaschilds == "true":
					for childlist in childs.findall("genrelist"):
						for genre in childlist.findall("genre"):
							gn = genre.get("name")
							gid = genre.get("id")
							gparentid = genre.get("parentid")
							ghaschilds = genre.get("haschildren")
							# print "[SHOUTcast] Genre %s id=%s parent=%s haschilds=%s" % (gn, gid, gparentid, ghaschilds)
							genreList.append(SHOUTcastGenre(name = gn, id = gid, parentid = gparentid, haschilds = ghaschilds))
		return genreList

	def showGenreList(self):
		self["headertext"].setText(_("SHOUTcast genre list"))
		self["list"].setMode(self.mode)
		self["list"].setList([ (x,) for x in self.genreList])
		self["list"].moveToIndex(self.genreListIndex)
		self["list"].show()

	def onSelectionChanged(self):
		pass
		# till I find a better solution
#		if self.mode == self.STATIONLIST:
#			self.stationListIndex = self["list"].getCurrentIndex()
#		elif self.mode == self.FAVORITELIST:
#			self.favoriteListIndex = self["list"].getCurrentIndex()
#		elif self.mode == self.GENRELIST:
#			self.genreListIndex = self["list"].getCurrentIndex()

	def ok_pressed(self):
		if self.visible:
			sel = None
			try:
				sel = self["list"].l.getCurrentSelection()[0]
			except:return
			if sel is None:
				return
			else:
				if self.mode == self.GENRELIST:
					self.genreListIndex = self["list"].getCurrentIndex()
					self.getStationList(sel.name)
				elif self.mode == self.STATIONLIST:
					self.stationListIndex = self["list"].getCurrentIndex()
					self.stopPlaying()
					if len(devid) > 8:
						url = self.SCY + "/sbin/tunein-station.pls?id=%s" % (sel.id)
					self["list"].hide()
					self["statustext"].setText(_("Getting streaming data from\n%s") % sel.name)
					self.currentStreamingStation = sel.name
					sendUrlCommand(url, None, 10).addCallback(self.callbackPLS).addErrback(self.callbackStationListError)
				elif self.mode == self.FAVORITELIST:
					self.favoriteListIndex = self["list"].getCurrentIndex()
					if sel.configItem.type.value == "url":
						self.stopPlaying()
						self["headertext"].setText(self.headerTextString)
						self.currentStreamingStation = sel.configItem.name.value
						self.playServiceStream(sel.configItem.text.value)
					elif sel.configItem.type.value == "pls":
						self.stopPlaying()
						url = sel.configItem.text.value
						self["list"].hide()
						self["statustext"].setText(_("Getting streaming data from\n%s") % sel.configItem.name.value)
						self.currentStreamingStation = sel.configItem.name.value
						sendUrlCommand(url, None,10).addCallback(self.callbackPLS).addErrback(self.callbackStationListError)
					elif sel.configItem.type.value == "genre":
						self.getStationList(sel.configItem.name.value)
				elif self.mode == self.SEARCHLIST and self.searchSHOUTcastString != "":
					self.searchSHOUTcast(self.searchSHOUTcastString)
		else:
			self.showWindow()

	def stopPlaying(self):
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self["headertext"].setText("")
		self["titel"].setText("")
		self["station"].setText("")
		self.summaries.setText("")
		if config.plugins.shoutcast.showcover.value:
			self["cover"].doHide()
		self.session.nav.stopService()
		
	def callbackPLS(self, result):
		self["headertext"].setText(self.headerTextString)
		found = False
		parts = string.split(result,"\n")
		for lines in parts:
			if lines.find("File1=") != -1:
				line = string.split(lines,"File1=")
				found = True
				self.playServiceStream(line[-1].rstrip().strip())
				
		if found:
			self["statustext"].setText("")
			self["list"].show()
		else:
			self.currentStreamingStation = ""
			self["statustext"].setText(_("No streaming data found..."))
			self["list"].show()
	def getStationList(self,genre):
		self.stationListHeader = _("genre %s") % genre
		self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
		self["headertext"].setText("")
		self["statustext"].setText(_("Getting %s") %  self.headerTextString)
		self["list"].hide()
		if len(devid) > 8:
			self.stationListURL = self.SC + "/station/advancedsearch&f=xml&k=%s&search=%s" % (devid, genre)
		else:
			self.stationListURL = "http://207.200.98.1/sbin/newxml.phtml?genre=%s" % genre
		self.stationListIndex = 0
		sendUrlCommand(self.stationListURL, None, 10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def callbackStationList(self, xmlstring):
		self.searchSHOUTcastString = ""
		self.stationListXML = xmlstring
		self["headertext"].setText(self.headerTextString)
		self.mode = self.STATIONLIST
		self["list"].setMode(self.mode)
		self.stationList = self.fillStationList(xmlstring)
		self["statustext"].setText("")
		self["list"].setList([ (x,) for x in self.stationList])
		if len(self.stationList):
			self["list"].moveToIndex(self.stationListIndex)
		self["list"].show()
		if self.reloadStationListTimerVar != 0:
			self.reloadStationListTimer.start(1000 * 60)

	def fillStationList(self,xmlstring):
		stationList = []
		try:
			root = xml.etree.cElementTree.fromstring(xmlstring)
		except: return []
		config_bitrate = int(config.plugins.shoutcast.streamingrate.value)
		data = root.find("data")
		if data == None:
			print "[SHOUTcast] Could not find data tag!"
			return []
		for slist in data.findall("stationlist"):
			for childs in slist.findall("tunein"):
				self.tunein = childs.get("base")
			for childs in slist.findall("station"):
				try: bitrate = int(childs.get("br"))
				except: bitrate = 0
				if bitrate >= config_bitrate:
					stationList.append(SHOUTcastStation(name = childs.get("name"), 
									mt = childs.get("mt"), id = childs.get("id"), br = childs.get("br"), 
									genre = childs.get("genre"), ct = childs.get("ct"), lc = childs.get("lc"), ml = childs.get("ml"), nsc = childs.get("nsc"),
									cst = childs.get("cst")))
		return stationList

	def menu_pressed(self):
		if not self.visible:
			self.showWindow()
		options = [(_("Config"), self.config),(_("Search"), self.search),]
		if self.mode == self.FAVORITELIST and self.getSelectedItem() is not None:
			options.extend(((_("rename current selected favorite"), self.renameFavorite),))
			options.extend(((_("remove current selected favorite"), self.removeFavorite),))
		elif self.mode == self.GENRELIST and self.getSelectedItem() is not None:
			options.extend(((_("Add current selected genre to favorite"), self.addGenreToFavorite),))
		elif self.mode == self.STATIONLIST and self.getSelectedItem() is not None:
			options.extend(((_("Add current selected station to favorite"), self.addStationToFavorite),))
		if len(self.currentStreamingURL) != 0:
			options.extend(((_("Add current playing stream to favorite"), self.addCurrentStreamToFavorite),))
		options.extend(((_("Hide"), self.hideWindow),))
		self.session.openWithCallback(self.menuCallback, ChoiceBox,list = options)

	def menuCallback(self, ret):
		ret and ret[1]()

	def hideWindow(self):
		self.visible = False
		self.hide()

	def showWindow(self):
		self.visible = True
		self.show()

	def addGenreToFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.addFavorite(name = sel.name, text = sel.name, favoritetype = "genre")			

	def addStationToFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.addFavorite(name = sel.name, text = self.SCY + "/sbin/tunein-station.pls?id=%s" % (sel.id), favoritetype = "pls", audio = sel.mt, bitrate = sel.br)			

	def addCurrentStreamToFavorite(self):
		self.addFavorite(name = self.currentStreamingStation, text = self.currentStreamingURL, favoritetype = "url")

	def addFavorite(self, name = "", text = "", favoritetype = "", audio = "", bitrate = ""):
		self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
		self.favoriteConfig.entriescount.save()
		newFavorite = self.initFavouriteEntryConfig()
		newFavorite.name.value = name
		newFavorite.text.value = text
		newFavorite.type.value = favoritetype
		newFavorite.audio.value = audio
		newFavorite.bitrate.value = bitrate
		newFavorite.save()
		self.favoriteConfig.saveToFile(self.FAVORITE_FILE)

	def renameFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.session.openWithCallback(self.renameFavoriteFinished, VirtualKeyBoard, title = _("Enter new name for favorite item"), text = sel.configItem.name.value)

	def renameFavoriteFinished(self, text = None):
		if text:
			sel = self.getSelectedItem()
			sel.configItem.name.value = text
			sel.configItem.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)
			self.favoriteListIndex = 0
			self.getFavoriteList()


	def removeFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value - 1
			self.favoriteConfig.entriescount.save()
			self.favoriteConfig.Entries.remove(sel.configItem)
			self.favoriteConfig.Entries.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)
			self.favoriteListIndex = 0
			self.getFavoriteList()

	def search(self):
		self.session.openWithCallback(self.searchSHOUTcast, VirtualKeyBoard, title = _("Enter text to search for"))

	def searchSHOUTcast(self, searchstring = None):
		if searchstring:
			self.stopReloadStationListTimer()
			self.stationListHeader = _("search-criteria %s") % searchstring
			self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
			self["headertext"].setText("")
			self["statustext"].setText(_("Searching SHOUTcast for %s...") % searchstring)
			self["list"].hide()
			if len(devid) > 8:
			   self.stationListURL = self.SC + "/station/advancedsearch&f=xml&k=%s&search=%s" % (devid, searchstring)
			else:
			   self.stationListURL = "http://207.200.98.1/sbin/newxml.phtml?search=%s" % searchstring
			self.mode = self.SEARCHLIST
			self.searchSHOUTcastString = searchstring
			self.stationListIndex = 0
			sendUrlCommand(self.stationListURL, None, 10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def config(self):
		self.stopReloadStationListTimer()
		self.session.openWithCallback(self.setupFinished, SHOUTcastSetup)

	def setupFinished(self, result):
		if result:
			if config.plugins.shoutcast.showcover.value:
				self["cover"].doShow()
			else:
				self["cover"].doHide()
			if self.mode == self.STATIONLIST:
				self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)
				self.stationListIndex = 0
				self.callbackStationList(self.stationListXML)

	def callbackStationListError(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(_("%s\nPress OK to try again...") % str(error.getErrorMessage()))
			except: pass

	def Error(self, error = None):
		if error is not None:
			# print "[SHOUTcast] Error: %s" % error
			try:
				self["list"].hide()
				self["statustext"].setText(str(error.getErrorMessage()))
			except: pass
		if self.nextGoogle:
			self.currentGoogle = self.nextGoogle
			self.nextGoogle = None
			sendUrlCommand(self.currentGoogle, None, 10).addCallback(self.GoogleImageCallback).addErrback(self.Error)
		else:
			self.currentGoogle = None
	
	def __onClose(self):
		global coverfiles
		for f in coverfiles:
			try:
				os.unlink(f)
			except:
				pass
		self.stopReloadStationListTimer()
		self.session.nav.event.remove(self.__event)
		self.currPlay = None
		containerStreamripper.dataAvail.remove(self.streamripperDataAvail)
		containerStreamripper.appClosed.remove(self.streamripperClosed)
		self.session.nav.playService(self.CurrentService)

	def GoogleImageCallback(self, result):
		global coverfiles
		if self.nextGoogle:
			self.currentGoogle = self.nextGoogle
			self.nextGoogle = None
			sendUrlCommand(self.currentGoogle, None, 10).addCallback(self.GoogleImageCallback).addErrback(self.Error)
			return
		self.currentGoogle = None
		foundPos = result.find("unescapedUrl\":\"")
		foundPos2 = result.find("\",\"url\":\"")

		if foundPos != -1 and foundPos2 != -1:
			url=result[foundPos+15:foundPos2]
			if len(url)>15:
				url= url.replace(" ", "%20")
				print "[SHOUTcast] Download URL: %s" % url
				validurl = True
			else:
				validurl = False
				print "[SHOUTcast] Invalid cover url or picture format!"
				if config.plugins.shoutcast.showcover.value:
					self["cover"].doHide()
			if validurl:
				self.currentcoverfile = (self.currentcoverfile + 1) % len(coverfiles)
				try:
					os.unlink(coverfiles[self.currentcoverfile-1])
				except:
					pass
				coverfile = coverfiles[self.currentcoverfile]
				print "[SHOUTcast] Downloading cover from %s to %s" % (url, coverfile)
				downloadPage(url, coverfile).addCallback(self.coverDownloadFinished, coverfile).addErrback(self.coverDownloadFailed)

	def coverDownloadFailed(self,result):
		print "[SHOUTcast] Cover download failed: %s" % result
		if config.plugins.shoutcast.showcover.value:
			self["statustext"].setText(_("Error downloading cover..."))
			self["cover"].doHide()

	def coverDownloadFinished(self, result, coverfile):
		if config.plugins.shoutcast.showcover.value:
			print "[SHOUTcast] Cover download finished: %s" % coverfile
			self["statustext"].setText("")
			self["cover"].updateIcon(coverfile)
			self["cover"].doShow()
		
	def __event(self, ev):
		if ev != 18:
			print "[SHOUTcast] EVENT ==>", ev
		if ev == 1 or ev == 4:
			print "[SHOUTcast] Tuned in, playing now!"
		if ev == 3 or ev == 7:
			self["statustext"].setText(_("Stream stopped playing, playback of stream stopped!"))
			print "[SHOUTcast] Stream stopped playing, playback of stream stopped!"
			self.session.nav.stopService()
		if ev == 5:
			if not self.currPlay:
				return
			sTitle = self.currPlay.info().getInfoString(iServiceInformation.sTagTitle)
			if self.oldtitle != sTitle:
				self.oldtitle=sTitle
				sTitle = sTitle.replace("Title:", "")[:55]
				if config.plugins.shoutcast.showcover.value:
					searchpara="album cover "
					if sTitle:
						url = "http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=%s%s&biw=%s&bih=%s&ift=jpg&ift=gif&ift=png" % (quote(searchpara), quote(sTitle), config.plugins.shoutcast.coverwidth.value, config.plugins.shoutcast.coverheight.value)
					else:
						url = "http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=no+cover+pic&biw=%s&bih=%s&ift=jpg&ift=gif&ift=png" % (config.plugins.shoutcast.coverwidth.value, config.plugins.shoutcast.coverheight.value)
					print "[SHOUTcast] Coverurl = %s" % url
					if self.currentGoogle:
						self.nextGoogle = url
					else:
						self.currentGoogle = url
						sendUrlCommand(url, None, 10).addCallback(self.GoogleImageCallback).addErrback(self.Error)
				if len(sTitle) == 0:
					sTitle = "n/a"
				title = _("Title: %s") % sTitle
				print "[SHOUTcast] Title: %s" % title
				self["titel"].setText(title)
				self.summaries.setText(title)
			else:
				print "[SHOUTcast] Ignoring useless updated info provided by stream engine!"
		#if ev == 6 or (ev > 8 and ev != 17):
		#	print "[SHOUTcast] Abnormal event %s from stream, so stop playing!" % ev
		#	self["statustext"].setText(_("Abnormal event from stream, aborting!"))
		#	self.session.nav.stopService()
			
	def playServiceStream(self, url):
		self.currPlay = None
		self.session.nav.stopService()
		if config.plugins.shoutcast.showcover.value:
			self["cover"].doHide()
		sref = eServiceReference(eServiceReference.idServiceMP3, eServiceReference.noFlags, url)
		try:
			self.session.nav.playService(sref)
		except:
			print "[SHOUTcast] Could not play %s" % sref
		self.currPlay = self.session.nav.getCurrentService()
		self.currentStreamingURL = url
		self["titel"].setText(_("Title: n/a"))
		self["station"].setText(_("Station: %s") % self.currentStreamingStation)

	def createSummary(self):
		return SHOUTcastLCDScreen

	def initFavouriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) -1
		self.favoriteConfig.Entries[i].name = ConfigText(default = "")
		self.favoriteConfig.Entries[i].text = ConfigText(default = "")
		self.favoriteConfig.Entries[i].type = ConfigText(default = "")
		self.favoriteConfig.Entries[i].audio = ConfigText(default = "")
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default = "")
		return self.favoriteConfig.Entries[i]

	def initFavouriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavouriteEntryConfig()
				i += 1

	def getSelectedItem(self):
		sel = None
		try:
			sel = self["list"].l.getCurrentSelection()[0]
		except:return None
		return sel
Ejemplo n.º 18
0
class FavoritesThumb(StreamsThumbCommon):
	def __init__(self, session, action, value, url):
		self.defaultImg = 'Extensions/OnDemand/icons/favorite.png'
		
		self.showWMA = str(config.ondemand.ShowiRadioWMA.value)
		self.showDefault = str(config.ondemand.ShowFavoriteDefault.value)
		self.showIcon = str(config.ondemand.ShowFavoriteLogos.value)

		if self.showIcon == 'True':		
			if self.showDefault == 'False':
				self.defaultImg = ''

		self.favoriteConfig = Config()
		if os_path.exists(FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(FAVORITE_FILE)

		self.favoriteConfig.entriescount = ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavoriteConfig()

		StreamsThumbCommon.__init__(self, session, action, value, url)

		self.skin = """
				<screen position="0,0" size="e,e" flags="wfNoBorder" >
					<widget name="lab1" position="0,0" size="e,e" font="Regular;24" halign="center" valign="center" transparent="0" zPosition="5" />
					<widget source="Title" render="Label" position="20,0" size="e,50" font="Regular;32" />
					<widget name="list" position="0,50" size="e,e-50" scrollbarMode="showOnDemand" transparent="1" />
					<ePixmap pixmap="skin_default/buttons/yellow.png" position="800,10" size="40,40" transparent="1" alphatest="on" />
					<widget source="key_yellow" render="Label" position="810,0" zPosition="1" size="250,40" font="Regular;20" valign="center" halign="center" transparent="1" />
				</screen>"""

		self["key_yellow"] = StaticText(_("Delete from Favorites"))
		
		self["favActions"] = ActionMap(["ColorActions"],
		{
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
		
		}, -1)

	def layoutFinished(self):
		self.setTitle("iRadio Player: Favorite Listings")

#----------------------------------------------------------------------------------------------------------------------------------------#

	def red_pressed(self):
		pass

	def green_pressed(self):
		pass

	def yellow_pressed(self):
		result = self.removeFavorite()

		if result == 0:
			self.session.open(MessageBox, _('Station deleted from Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
		else:
			self.session.open(MessageBox, _('Station delete failed, please check the Debug logs!'), type=MessageBox.TYPE_INFO, timeout=3)

	def blue_pressed(self):
		pass

#----------------------------------------------------------------------------------------------------------------------------------------#

	def removeFavorite(self):
		try:
			selFav = self["list"].l.getCurrentSelection()[4]
			if selFav is not None:
				self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value - 1
				self.favoriteConfig.entriescount.save()
				
				for item in self.favoriteConfig.Entries:
					if str(item.text.value) == str(selFav):
						self.favoriteConfig.Entries.remove(item)

				self.favoriteConfig.Entries.save()
				self.favoriteConfig.saveToFile(FAVORITE_FILE)
				self.favoriteListIndex = 0
				self.mediaList = []
				self.getFavoriteList()
				return 0
		except (Exception) as exception:
			print 'removeFavorite: Error deleting Favorite: ', exception
			return -1

	def getFavoriteList(self):
		self.getFavMediaData(self.mediaList, self.url)
		if len(self.mediaList) == 0:
			self.mediaProblemPopup("No Stations Found!")
		self.updateMenu()

	def initFavoriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) - 1
		self.favoriteConfig.Entries[i].name = ConfigText(default='')
		self.favoriteConfig.Entries[i].text = ConfigText(default='')
		self.favoriteConfig.Entries[i].type = ConfigText(default='')
		self.favoriteConfig.Entries[i].audio = ConfigText(default='')
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default='')
		self.favoriteConfig.Entries[i].icon = ConfigText(default='')
		return self.favoriteConfig.Entries[i]

	def initFavoriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavoriteEntryConfig()
				i += 1

#----------------------------------------------------------------------------------------------------------------------------------------#

	def setupCallback(self, retval = None):
		if retval == 'cancel' or retval is None:
			return
		else:
			self.getFavoriteList()

	def go(self):
		stationID = self["list"].l.getCurrentSelection()[4]
		stationName = self["list"].l.getCurrentSelection()[1]
		favType = self["list"].l.getCurrentSelection()[3]

		if stationID:
			if favType == 'manual':
				fileUrl = stationID
			elif favType == 'tunein':
				fileUrl = findPlayUrl(stationID, 'tunein', self.showWMA)
			else:
				fileUrl = findPlayUrl(stationID, 'favourite', self.showWMA)
			
			if fileUrl:
				fileRef = eServiceReference(4097,0,fileUrl)
				fileRef.setName (stationName)
#				lastservice = self.session.nav.getCurrentlyPlayingServiceOrGroup()
				self.session.open(MoviePlayer, fileRef, None)
			else:
				self.session.open(MessageBox, _('Sorry, unable to find playable stream!'), type=MessageBox.TYPE_INFO, timeout=5)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def getFavMediaData(self, weekList, genre):
		
		shoutIcon = 'http://977music.com/images/uploads/pages/SHOUTcast_yellow.jpg'
		tuneIcon = 'http://www.ipadmaniac.com/wp-content/uploads/2011/06/TuneIn-Radio-Logo.png'
		short = ''
		name = ''
		date1 = ''
		stream = ''
		channel = ''
		icon = ''
		duration = ''

		try:
			for item in self.favoriteConfig.Entries:
            			# Iterate through the elements
				date1 = str(item.bitrate.value)
				name_tmp = str(item.name.value)
				name = checkUnicode(name_tmp)
				short = str(item.text.value)
				channel = str(item.type.value)
				stream = str(item.text.value)
				duration = str(item.audio.value)
				
				# Show the logo for the Favorite source.
				if self.showIcon == 'True':
					icon = str(item.icon.value)
					if icon == '':
						if channel == 'shoutcast':
							icon = shoutIcon
						elif channel == 'tunein':
							icon = tuneIcon
				else:
					icon = ''

				weekList.append((date1, name, short, channel, stream, icon, duration, False))

		except (Exception) as exception:
			print 'getFavMediaData: Error getting Media info: ', exception
Ejemplo n.º 19
0
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
		self.session.nav.stopService()
		self["cover"] = Cover()
		self["key_red"] = StaticText(_("Record"))
		self["key_green"] = StaticText(_("Genres"))
		self["key_yellow"] = StaticText(_("Stations"))
		self["key_blue"] = StaticText(_("Favorites"))
		self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
			{
				iPlayableService.evUpdatedInfo: self.__evUpdatedInfo,
				iPlayableService.evUser+10: self.__evAudioDecodeError,
				iPlayableService.evUser+12: self.__evPluginError
			})
		InfoBarSeek.__init__(self, actionmap = "MediaPlayerSeekActions")
		self.mode = self.FAVORITELIST
		self["list"] = SHOUTcastList()
		self["list"].connectSelChanged(self.onSelectionChanged)
		self["statustext"] = Label(_("Getting SHOUTcast genre list..."))
		self["actions"] = ActionMap(["WizardActions", "DirectionActions", "ColorActions", "EPGSelectActions"],
		{
			"ok": self.ok_pressed,
			"back": self.close,
			"input_date_time": self.menu_pressed,
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
			
		}, -1)
		self.stationList = []
		self.stationListIndex = 0
		self.genreList = []
		self.genreListIndex = 0
		self.favoriteList = []
		self.favoriteListIndex = 0

		self.favoriteConfig = Config()
		if os.path.exists(self.FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE)
		else:
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_DEFAULT)
		self.favoriteConfig.entriescount =  ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavouriteConfig()
		self.stationListXML = ""
		self["titel"] = Label()
		self["station"] = Label()
		self["headertext"] = Label()
		self["console"] = Label()
		self.headerTextString = ""
		self.stationListHeader = ""
		self.tunein = ""
		self.searchSHOUTcastString = ""
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self.stationListURL = ""
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.getFavoriteList)

		self.reloadStationListTimer = eTimer()
		self.reloadStationListTimer.timeout.get().append(self.reloadStationListTimerTimeout)
		self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)

		self.visible = True

		global containerStreamripper
		if containerStreamripper is None:
			containerStreamripper = eConsoleAppContainer()

		containerStreamripper.dataAvail.append(self.streamripperDataAvail)
		containerStreamripper.appClosed.append(self.streamripperClosed)

		if containerStreamripper.running():
			self["key_red"].setText(_("Stop record"))
			# just to hear to recording music when starting the plugin...
			self.currentStreamingStation = _("Recording stream station")
			self.playServiceStream("http://localhost:9191")
Ejemplo n.º 20
0
class tuneinGenresThumb(StreamsThumbCommon):
	def __init__(self, session, action, value, url):
		self.defaultImg = 'Extensions/OnDemand/icons/FolderIcon.png'
		
		self.showWMA = str(config.ondemand.ShowiRadioWMA.value)
		self.showDefault = str(config.ondemand.ShowTuneinDefault.value)
		self.showIcon = str(config.ondemand.ShowTuneinLogos.value)

		if self.showIcon == 'True':		
			if self.showDefault == 'False':
				self.defaultImg = ''
			
		self.favoriteConfig = Config()
		if os_path.exists(FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(FAVORITE_FILE)

		self.favoriteConfig.entriescount = ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavoriteConfig()
		self.genreList = []
		self.getGenreList(self.genreList)

		StreamsThumbCommon.__init__(self, session, action, value, url)

		self.skin = """
				<screen position="0,0" size="e,e" flags="wfNoBorder" >
					<widget name="lab1" position="0,0" size="e,e" font="Regular;24" halign="center" valign="center" transparent="0" zPosition="5" />
					<widget source="Title" render="Label" position="20,0" size="e,50" font="Regular;32" />
					<widget name="list" position="0,50" size="e,e-50" scrollbarMode="showOnDemand" transparent="1" />
					<ePixmap pixmap="ViX-Common/buttons/green.png" position="800,10" size="40,40" transparent="1" alphatest="on" />
					<widget source="key_green" render="Label" position="810,0" zPosition="1" size="200,40" font="Regular;20" valign="center" halign="center" transparent="1" />
				</screen>"""

		self["key_green"] = StaticText(_("Add to Favorites"))
		
		self["genreActions"] = ActionMap(["ColorActions"],
		{
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
		
		}, -1)

	def layoutFinished(self):
		self.setTitle("Tunein Radio Player: Listings for " +self.title)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def red_pressed(self):
		pass

	def green_pressed(self):
		date1 = self["list"].l.getCurrentSelection()[0]
		name = self["list"].l.getCurrentSelection()[1]
		short = self["list"].l.getCurrentSelection()[2]
		channel = self["list"].l.getCurrentSelection()[3]
		stream = self["list"].l.getCurrentSelection()[4]
		icon = self["list"].l.getCurrentSelection()[5]
		duration = self["list"].l.getCurrentSelection()[6]	
		exists = 'False'

		if (stream != 'None') and (channel != 'link'):
			for item in self.favoriteConfig.Entries:
				if str(item.text.value) == str(stream):
					exists = 'True'

			if exists == 'False':
				result = self.addFavorite(name=name, text=stream, favoritetype='tunein', audio=duration, bitrate=date1, icon=icon)
				if result == 0:
					self.session.open(MessageBox, _('Station saved to Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
				else:
					self.session.open(MessageBox, _('Station save failed, please check the Debug logs!'), type=MessageBox.TYPE_INFO, timeout=3)
			else:
				self.session.open(MessageBox, _('Station Already Saved in Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
				pass
		else:
			self.session.open(MessageBox, _('Selection does not contain a stream!'), type=MessageBox.TYPE_INFO, timeout=3)
			pass

	def yellow_pressed(self):
		pass

	def blue_pressed(self):
		pass

#----------------------------------------------------------------------------------------------------------------------------------------#

	def addFavorite(self, name = '', text = '', favoritetype = '', audio = '', bitrate = '', icon = ''):
		try:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
			self.favoriteConfig.entriescount.save()
			newFavorite = self.initFavoriteEntryConfig()
			newFavorite.name.value = name
			newFavorite.text.value = text
			newFavorite.type.value = favoritetype
			newFavorite.audio.value = audio
			newFavorite.bitrate.value = bitrate
			newFavorite.icon.value = icon
			newFavorite.save()
			self.favoriteConfig.saveToFile(FAVORITE_FILE)
			return 0
		except (Exception) as exception:
			print 'addFavorite: Error saving to Favorites: ', exception
			return -1

	def initFavoriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) - 1
		self.favoriteConfig.Entries[i].name = ConfigText(default='')
		self.favoriteConfig.Entries[i].text = ConfigText(default='')
		self.favoriteConfig.Entries[i].type = ConfigText(default='')
		self.favoriteConfig.Entries[i].audio = ConfigText(default='')
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default='')
		self.favoriteConfig.Entries[i].icon = ConfigText(default='')
		return self.favoriteConfig.Entries[i]

	def initFavoriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavoriteEntryConfig()
				i += 1

#----------------------------------------------------------------------------------------------------------------------------------------#

	def setupCallback(self, retval = None):
		if retval == 'cancel' or retval is None:
			return
		elif retval == 'search':
			self.timerCmd = self.TIMER_CMD_VKEY
			self.cbTimer.start(10)
		else:
			self.getTuneinMediaData(self.mediaList, self.url)
			if len(self.mediaList) == 0:
				self.session.open(MessageBox, _('Sorry, No Stations Found!'), type=MessageBox.TYPE_INFO, timeout=5)
			self.updateMenu()

	def keyboardCallback(self, callback = None):
		if callback is not None and len(callback):
			self.setTitle("Tunein Radio Player: Search Listings for " +callback)
			stationsearch = callback.replace(' ', '+')
			searchurl = 'http://opml.radiotime.com/Search.ashx?query=%s' % (stationsearch)
			self.getTuneinMediaData(self.mediaList, searchurl)
			self.updateMenu()
			if len(self.mediaList) == 0:
				self.session.openWithCallback(self.close, MessageBox, _("No items matching your search criteria were found"), MessageBox.TYPE_INFO, timeout=5, simple = True)
		else:
			self.close()

#----------------------------------------------------------------------------------------------------------------------------------------#

	def go(self):
		showID = self["list"].l.getCurrentSelection()[4]
		showName = self["list"].l.getCurrentSelection()[1]
		children = self["list"].l.getCurrentSelection()[3]

		if children == "link":
			self.session.open(tuneinGenresThumb, showID, showName, showID)
		elif showID != 'None':
			fileUrl = findPlayUrl(showID, 'tunein', self.showWMA)
			
			if fileUrl:
				fileRef = eServiceReference(4097,0,fileUrl)
				fileRef.setName (showName)
				lastservice = self.session.nav.getCurrentlyPlayingServiceOrGroup()
				self.session.open(MoviePlayer, fileRef, None, lastservice)
				
				# TODO: Find out how to use this!
				#NavigationInstance.instance.playService(fileRef)
			else:
				self.session.open(MessageBox, _('Sorry, unable to find playable stream!'), type=MessageBox.TYPE_INFO, timeout=5)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def getTuneinMediaData(self, weekList, url):

		short = ''
		name = ''
		date1 = ''
		stream = ''
		channel = ''
		icon = ''
		duration = ''

		try:
			# Read the URL for the selected genre on the Main Menu.
			xml = wgetUrl(url)

			# Parse the XML with elementTree
			tree = ET.fromstring(xml)

			# Find the first element <outline>
			for elem in tree.iter('outline'):
				# Iterate through the elements
				name_tmp = str(elem.get('text'))
				name_split = name_tmp.rsplit('(',1)
				name = tidyString(name_split[0])
				avail = str(elem.get('key'))
				
				if (avail != 'unavailable') and (name != 'This program is not available'):
					genreID = str(elem.get('genre_id'))
					genre = self.getGenreName(genreID)
					stream = str(elem.get('URL'))
					channel = str(elem.get('type'))
					formats = str(elem.get('formats'))

					if channel == 'link':
						date1 = 'More --->'
						short = '\nPress OK for sub items of '+name
						duration = ''
					else:
						bitrate = str(elem.get('bitrate'))
						if bitrate == 'None':
							date1 = _("Bitrate: Unknown")
						else:
							date1 = _("Bitrate: ")+bitrate+" kbps"

						short_tmp = str(elem.get('subtext'))
						if genre != 'None':
							short = _("Recently Played: ")+checkUnicode(short_tmp)+_("\n\nGenre: ")+genre
						else:
							short = _("Recently Played: ")+checkUnicode(short_tmp)

						if formats == 'None':
							duration = _("Audio: Unknown")
						else:
							duration = _("Audio: ")+formats

					if self.showIcon == 'True':
						icon = str(elem.get('image'))
						if icon == 'None':
							icon = ''
					else:
						icon = ''

					if (channel != 'None'):
						if (self.showWMA == 'False' and formats =='wma'):
							print 'getTuneinMediaData: Not showing WMA: showWMA: ', self.showWMA
							pass
						else:
							weekList.append((date1, name, short, channel, stream, icon, duration, False))

		except (Exception) as exception:
			print 'getTuneinMediaData: Error getting Media info: ', exception

#----------------------------------------------------------------------------------------------------------------------------------------#

	def getGenreList(self, genreList):
		url = 'http://opml.radiotime.com/Describe.ashx?c=genres'
		# Read the URL for the selected category on the Main Menu.
		try:
			# Read the Genre List from Shoutcast.
			xml = wgetUrl(url)

			# Make sure data is returned before attempting to parse.
			if xml:
				# Parse the XML with elementTree
				tree = ET.fromstring(xml)

				# Find the first element <outline>
				for elem in tree.iter('outline'):
					# Iterate through the elements
					genre = str(elem.get('text'))
					id = str(elem.get('guide_id'))
					genreList.append((id, genre))

		except (Exception) as exception:
			print 'getGenreList: Error parsing genres: ', exception

	def getGenreName(self, genreID):
		try:
			genreName = 'None'

			for genre in self.genreList:
				if genre[0] == genreID:
					genreName = genre[1]
					break

			return genreName
		except (Exception) as exception:
			print 'getGenreName: Error Searching genres: ', exception
			return 'None'
Ejemplo n.º 21
0
class shoutGenresThumb(StreamsThumbCommon):
	def __init__(self, session, action, value, url):
		self.defaultImg = 'Extensions/OnDemand/icons/SHOUTcast.png'
		
		self.showWMA = str(config.ondemand.ShowiRadioWMA.value)
		self.showDefault = str(config.ondemand.ShowShoutcastDefault.value)
		self.showIcon = str(config.ondemand.ShowShoutcastLogos.value)

		if self.showIcon == 'True':		
			if self.showDefault == 'False':
				self.defaultImg = ''

		self.favoriteConfig = Config()
		if os_path.exists(FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(FAVORITE_FILE)

		self.favoriteConfig.entriescount = ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavoriteConfig()

		StreamsThumbCommon.__init__(self, session, action, value, url)

		self.skin = """
				<screen position="0,0" size="e,e" flags="wfNoBorder" >
					<widget name="lab1" position="0,0" size="e,e" font="Regular;24" halign="center" valign="center" transparent="0" zPosition="5" />
					<widget source="Title" render="Label" position="20,0" size="e,50" font="Regular;32" />
					<widget name="list" position="0,50" size="e,e-50" scrollbarMode="showOnDemand" transparent="1" />
					<ePixmap pixmap="skin_default/buttons/green.png" position="800,10" size="40,40" transparent="1" alphatest="on" />
					<widget source="key_green" render="Label" position="810,0" zPosition="1" size="200,40" font="Regular;20" valign="center" halign="center" transparent="1" />
				</screen>"""

		self["key_green"] = StaticText(_("Add to Favorites"))
		
		self["genreActions"] = ActionMap(["ColorActions"],
		{
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
		
		}, -1)

	def layoutFinished(self):
		self.setTitle("SHOUTcast Radio Player: Listings for " +self.title)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def red_pressed(self):
		pass

	def green_pressed(self):
		date1 = self["list"].l.getCurrentSelection()[0]
		name = self["list"].l.getCurrentSelection()[1]
		short = self["list"].l.getCurrentSelection()[2]
		channel = self["list"].l.getCurrentSelection()[3]
		stream = self["list"].l.getCurrentSelection()[4]
		icon = self["list"].l.getCurrentSelection()[5]
		duration = self["list"].l.getCurrentSelection()[6]
		exists = 'False'

		if stream is not None:
			for item in self.favoriteConfig.Entries:
				if str(item.text.value) == str(stream):
					exists = 'True'

			if exists == 'False':
				result = self.addFavorite(name=name, text=stream, favoritetype='shoutcast', audio=duration, bitrate=date1, icon=icon)
				if result == 0:
					self.session.open(MessageBox, _('Station saved to Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
				else:
					self.session.open(MessageBox, _('Station save failed, please check the Debug logs!'), type=MessageBox.TYPE_INFO, timeout=3)
			else:
				self.session.open(MessageBox, _('Station Already Saved in Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
				pass
		else:
			self.session.open(MessageBox, _('Selection does not contain a stream!'), type=MessageBox.TYPE_INFO, timeout=3)
			pass

	def yellow_pressed(self):
		pass

	def blue_pressed(self):
		pass

#----------------------------------------------------------------------------------------------------------------------------------------#

	def addFavorite(self, name = '', text = '', favoritetype = '', audio = '', bitrate = '', icon = ''):
		try:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
			self.favoriteConfig.entriescount.save()
			newFavorite = self.initFavoriteEntryConfig()
			newFavorite.name.value = name
			newFavorite.text.value = text
			newFavorite.type.value = favoritetype
			newFavorite.audio.value = audio
			newFavorite.bitrate.value = bitrate
			newFavorite.icon.value = icon
			newFavorite.save()
			self.favoriteConfig.saveToFile(FAVORITE_FILE)
			return 0
		except (Exception) as exception:
			print 'addFavorite: Error saving to Favorites: ', exception
			return -1

	def getFavoriteList(self):
		self.getFavMediaData(self.mediaList, self.url)
		if len(self.mediaList) == 0:
			self.mediaProblemPopup("No Stations Found!")
		self.updateMenu()

	def initFavoriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) - 1
		self.favoriteConfig.Entries[i].name = ConfigText(default='')
		self.favoriteConfig.Entries[i].text = ConfigText(default='')
		self.favoriteConfig.Entries[i].type = ConfigText(default='')
		self.favoriteConfig.Entries[i].audio = ConfigText(default='')
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default='')
		self.favoriteConfig.Entries[i].icon = ConfigText(default='')
		return self.favoriteConfig.Entries[i]

	def initFavoriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavoriteEntryConfig()
				i += 1

#----------------------------------------------------------------------------------------------------------------------------------------#

	def setupCallback(self, retval = None):
		if retval == 'cancel' or retval is None:
			return
			
		elif retval == 'search':
			self.timerCmd = self.TIMER_CMD_VKEY
			self.cbTimer.start(10)

		else:
			genresearch = self.url.replace(' All', '')
			genresearch = genresearch.replace(' ', '+')
			stationurl = 'http://api.shoutcast.com/legacy/genresearch?k=%s&genre=%s' % (devid, genresearch)
			
			self.getShoutcastMediaData(self.mediaList, stationurl)
			if len(self.mediaList) == 0:
				self.mediaProblemPopup("No Stations Found!")
			self.updateMenu()

	def keyboardCallback(self, callback = None):
		if callback is not None and len(callback):
			self.setTitle("SHOUTcast Radio Player: Search Listings for " +callback)
			
			genresearch = callback.replace(' ', '+')
			searchurl = 'http://api.shoutcast.com/legacy/stationsearch?k=%s&search=%s' % (devid, str(genresearch))
			
			self.getShoutcastMediaData(self.mediaList, searchurl)
			self.updateMenu()
			if len(self.mediaList) == 0:
				self.session.openWithCallback(self.close, MessageBox, _("No items matching your search criteria were found"), MessageBox.TYPE_INFO, timeout=5)
		else:
			self.close()

	def go(self):
		showID = self["list"].l.getCurrentSelection()[4]
		showName = self["list"].l.getCurrentSelection()[1]

		if showID:
			fileUrl = findPlayUrl(showID, 'shoutcast', self.showWMA)
			
			if fileUrl:
				fileRef = eServiceReference(4097,0,fileUrl)
				fileRef.setName (showName)
#				lastservice = self.session.nav.getCurrentlyPlayingServiceOrGroup()
				self.session.open(MoviePlayer, fileRef, None)
			else:
				self.session.open(MessageBox, _('Sorry, unable to find playable stream!'), type=MessageBox.TYPE_INFO, timeout=5)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def getShoutcastMediaData(self, weekList, url):

		plsurl = 'http://yp.shoutcast.com/sbin/tunein-station.pls?id='
		short = ''
		name = ''
		date1 = ''
		stream = ''
		channel = ''
		icon = ''
		duration = ''

		try:
			# Read the URL for the selected genre on the Main Menu.
			xml = wgetUrl(url)

			# Make sure reading the URL returned data.
			if xml:
				# Parse the XML with elementTree
				tree = ET.fromstring(xml)

				# Find the first element <station>
				for elem in tree.iter('station'):
					# Iterate through the elements
					name_tmp = str(elem.get('name'))
					name = checkUnicode(name_tmp)
					id = str(elem.get('id'))
					stream = plsurl+id
					short_tmp = str(elem.get('ct'))
					genre = str(elem.get('genre'))
					bitrate = str(elem.get('br'))
					audio = str(elem.get('mt'))
					
					if genre != 'None':
						short = _("Recently Played: ")+checkUnicode(short_tmp)+_("\n\nGenre: ")+genre
					else:
						short = _("Recently Played: ")+checkUnicode(short_tmp)

					if bitrate != 'None':
						date1 = _("Bitrate: ")+bitrate+" kbps"
					else:
						date1 = _("Bitrate: Unknown")
					
					if audio != 'None':
						duration = _("Audio: ")+audio
					else:
						duration = _("Audio: Unknown")

					weekList.append((date1, name, short, channel, stream, icon, duration, False))

		except (Exception) as exception:
			print 'getShoutcastMediaData: Error getting Media info: ', exception
Ejemplo n.º 22
0
class FavoritesThumb(StreamsThumbCommon):
	def __init__(self, session, action, value, url):
		self.defaultImg = 'Extensions/OnDemand/icons/favorite.png'
		
		self.showWMA = str(config.ondemand.ShowiRadioWMA.value)
		self.showDefault = str(config.ondemand.ShowFavoriteDefault.value)
		self.showIcon = str(config.ondemand.ShowFavoriteLogos.value)

		if self.showIcon == 'True':		
			if self.showDefault == 'False':
				self.defaultImg = ''

		self.favoriteConfig = Config()
		if os_path.exists(FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(FAVORITE_FILE)

		self.favoriteConfig.entriescount = ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavoriteConfig()

		StreamsThumbCommon.__init__(self, session, action, value, url)

		self.skin = """
				<screen position="0,0" size="e,e" flags="wfNoBorder" >
					<widget name="lab1" position="0,0" size="e,e" font="Regular;24" halign="center" valign="center" transparent="0" zPosition="5" />
					<widget source="Title" render="Label" position="20,0" size="e,50" font="Regular;32" />
					<widget name="list" position="0,50" size="e,e-50" scrollbarMode="showOnDemand" transparent="1" />
					<ePixmap pixmap="ViX-Common/buttons/yellow.png" position="800,10" size="40,40" transparent="1" alphatest="on" />
					<widget source="key_yellow" render="Label" position="810,0" zPosition="1" size="250,40" font="Regular;20" valign="center" halign="center" transparent="1" />
				</screen>"""

		self["key_yellow"] = StaticText(_("Delete from Favorites"))
		
		self["favActions"] = ActionMap(["ColorActions"],
		{
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
		
		}, -1)

	def layoutFinished(self):
		self.setTitle("iRadio Player: Favorite Listings")

#----------------------------------------------------------------------------------------------------------------------------------------#

	def red_pressed(self):
		pass

	def green_pressed(self):
		pass

	def yellow_pressed(self):
		result = self.removeFavorite()

		if result == 0:
			self.session.open(MessageBox, _('Station deleted from Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
		else:
			self.session.open(MessageBox, _('Station delete failed, please check the Debug logs!'), type=MessageBox.TYPE_INFO, timeout=3)

	def blue_pressed(self):
		pass

#----------------------------------------------------------------------------------------------------------------------------------------#

	def removeFavorite(self):
		try:
			selFav = self["list"].l.getCurrentSelection()[4]
			if selFav is not None:
				self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value - 1
				self.favoriteConfig.entriescount.save()
				
				for item in self.favoriteConfig.Entries:
					if str(item.text.value) == str(selFav):
						self.favoriteConfig.Entries.remove(item)

				self.favoriteConfig.Entries.save()
				self.favoriteConfig.saveToFile(FAVORITE_FILE)
				self.favoriteListIndex = 0
				self.mediaList = []
				self.getFavoriteList()
				return 0
		except (Exception) as exception:
			print 'removeFavorite: Error deleting Favorite: ', exception
			return -1

	def getFavoriteList(self):
		self.getFavMediaData(self.mediaList, self.url)
		if len(self.mediaList) == 0:
			self.mediaProblemPopup("No Stations Found!")
		self.updateMenu()

	def initFavoriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) - 1
		self.favoriteConfig.Entries[i].name = ConfigText(default='')
		self.favoriteConfig.Entries[i].text = ConfigText(default='')
		self.favoriteConfig.Entries[i].type = ConfigText(default='')
		self.favoriteConfig.Entries[i].audio = ConfigText(default='')
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default='')
		self.favoriteConfig.Entries[i].icon = ConfigText(default='')
		return self.favoriteConfig.Entries[i]

	def initFavoriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavoriteEntryConfig()
				i += 1

#----------------------------------------------------------------------------------------------------------------------------------------#

	def setupCallback(self, retval = None):
		if retval == 'cancel' or retval is None:
			return
		else:
			self.getFavoriteList()

	def go(self):
		stationID = self["list"].l.getCurrentSelection()[4]
		stationName = self["list"].l.getCurrentSelection()[1]
		favType = self["list"].l.getCurrentSelection()[3]

		if stationID:
			if favType == 'manual':
				fileUrl = stationID
			elif favType == 'tunein':
				fileUrl = findPlayUrl(stationID, 'tunein', self.showWMA)
			else:
				fileUrl = findPlayUrl(stationID, 'favourite', self.showWMA)
			
			if fileUrl:
				fileRef = eServiceReference(4097,0,fileUrl)
				fileRef.setName (stationName)
				lastservice = self.session.nav.getCurrentlyPlayingServiceOrGroup()
				self.session.open(MoviePlayer, fileRef, None, lastservice)
			else:
				self.session.open(MessageBox, _('Sorry, unable to find playable stream!'), type=MessageBox.TYPE_INFO, timeout=5)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def getFavMediaData(self, weekList, genre):
		
		shoutIcon = 'http://977music.com/images/uploads/pages/SHOUTcast_yellow.jpg'
		tuneIcon = 'http://www.ipadmaniac.com/wp-content/uploads/2011/06/TuneIn-Radio-Logo.png'
		short = ''
		name = ''
		date1 = ''
		stream = ''
		channel = ''
		icon = ''
		duration = ''

		try:
			for item in self.favoriteConfig.Entries:
            			# Iterate through the elements
				date1 = str(item.bitrate.value)
				name_tmp = str(item.name.value)
				name = checkUnicode(name_tmp)
				short = str(item.text.value)
				channel = str(item.type.value)
				stream = str(item.text.value)
				duration = str(item.audio.value)
				
				# Show the logo for the Favorite source.
				if self.showIcon == 'True':
					icon = str(item.icon.value)
					if icon == '':
						if channel == 'shoutcast':
							icon = shoutIcon
						elif channel == 'tunein':
							icon = tuneIcon
				else:
					icon = ''

				weekList.append((date1, name, short, channel, stream, icon, duration, False))

		except (Exception) as exception:
			print 'getFavMediaData: Error getting Media info: ', exception
from Screens.Screen import Screen

from Components.config import Config
from Components.config import ConfigText
from Components.config import ConfigYesNo
from Components.config import getConfigListEntry
from Components.ConfigList import ConfigListScreen
from Components.ActionMap import ActionMap
from Components.Button import Button

from ConfigTextWithSuggestions import ConfigTextWithSuggestions

from . import _

playlistContext = Config()
playlistContext.name = ConfigText(_("Name"), False)
playlistContext.description = ConfigText(_("Description"), False)
playlistContext.private = ConfigYesNo()


class YouTubeAddPlaylistDialog(Screen, ConfigListScreen):
	def __init__(self, session):
		Screen.__init__(self, session)

		self.session = session

		self["actions"] = ActionMap(["YouTubeAddPlaylistActions"],
		{
			"save"		: 	self.keySave,
			"cancel"	: 	self.keyCancel
Ejemplo n.º 24
0
class SHOUTcastWidget(Screen, InfoBarSeek):

	GENRELIST = 0
	STATIONLIST = 1
	FAVORITELIST = 2
	SEARCHLIST = 3

	STREAMRIPPER_BIN = '/usr/bin/streamripper'

	FAVORITE_FILE_DEFAULT = '/usr/lib/enigma2/python/Plugins/Extensions/SHOUTcast/favorites'
	FAVORITE_FILE = '/usr/lib/enigma2/python/Plugins/Extensions/SHOUTcast/favorites.user'

	sz_w = getDesktop(0).size().width()
	if sz_w == 1280:
		skin = """
			<screen name="SHOUTcastWidget" position="0,0" size="1280,720" flags="wfNoBorder" backgroundColor="#00000000" title="SHOUTcast">
				<ePixmap position="50,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
				<ePixmap position="200,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
				<ePixmap position="350,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
				<ePixmap position="500,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
				<widget render="Label" source="key_red" position="50,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_green" position="200,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_yellow" position="350,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_blue" position="500,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget name="headertext" position="50,77" zPosition="1" size="1180,23" font="Regular;20" transparent="1"  backgroundColor="#00000000"/>
				<widget name="statustext" position="20,270" zPosition="1" size="1240,90" font="Regular;20" halign="center" valign="center" transparent="0"  backgroundColor="#00000000"/>
				<widget name="list" position="50,110" zPosition="2" size="1180,445" scrollbarMode="showOnDemand" transparent="0"  backgroundColor="#00000000"/>
				<widget name="titel" position="160,580" zPosition="1" size="900,20" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="station" position="160,600" zPosition="1" size="900,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="console" position="160,650" zPosition="1" size="900,50" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="cover" zPosition="2" position="50,580" size="102,110" alphatest="blend" />
				<ePixmap position="1100,35" zPosition="4" size="120,35" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/SHOUTcast/shoutcast-logo1-fs8.png" transparent="1" alphatest="on" />
			</screen>"""

	elif sz_w == 1024:
		skin = """
			<screen name="SHOUTcastWidget" position="0,0" size="1024,576" flags="wfNoBorder" backgroundColor="#00000000" title="SHOUTcast">
				<ePixmap position="50,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
				<ePixmap position="200,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
				<ePixmap position="350,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
				<ePixmap position="500,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
				<widget render="Label" source="key_red" position="50,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_green" position="200,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_yellow" position="350,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_blue" position="500,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget name="headertext" position="50,77" zPosition="1" size="900,23" font="Regular;20" transparent="1"  backgroundColor="#00000000"/>
				<widget name="statustext" position="20,270" zPosition="1" size="1004,90" font="Regular;20" halign="center" valign="center" transparent="0"  backgroundColor="#00000000"/>
				<widget name="list" position="50,110" zPosition="2" size="940,313" scrollbarMode="showOnDemand" transparent="0"  backgroundColor="#00000000"/>
				<widget name="titel" position="160,450" zPosition="1" size="800,20" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="station" position="160,470" zPosition="1" size="800,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="console" position="160,520" zPosition="1" size="800,50" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="cover" zPosition="2" position="50,450" size="102,110" alphatest="blend" />
				<ePixmap position="870,35" zPosition="4" size="120,35" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/SHOUTcast/shoutcast-logo1-fs8.png" transparent="1" alphatest="on" />
			</screen>"""
	else:

		skin = """
			<screen name="SHOUTcastWidget" position="0,0" size="720,576" flags="wfNoBorder" backgroundColor="#00000000" title="SHOUTcast">
				<ePixmap position="50,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
				<ePixmap position="210,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
				<ePixmap position="370,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
				<ePixmap position="530,30" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
				<widget render="Label" source="key_red" position="50,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_green" position="210,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_yellow" position="370,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget render="Label" source="key_blue" position="530,30" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
				<widget name="headertext" position="50,77" zPosition="1" size="620,23" font="Regular;20" transparent="1"  backgroundColor="#00000000"/>
				<widget name="statustext" position="50,270" zPosition="1" size="620,90" font="Regular;20" halign="center" valign="center" transparent="0"  backgroundColor="#00000000"/>
				<widget name="list" position="50,120" zPosition="2" size="620,249" scrollbarMode="showOnDemand" transparent="0"  backgroundColor="#00000000"/>
				<widget name="titel" position="155,400" zPosition="1" size="525,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="station" position="155,445" zPosition="1" size="525,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="console" position="155,490" zPosition="1" size="525,50" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
				<widget name="cover" zPosition="2" position="50,400" size="102,110" alphatest="blend" />
				<ePixmap position="550,77" zPosition="4" size="120,35" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/SHOUTcast/shoutcast-logo1-fs8.png" transparent="1" alphatest="on" />
			</screen>"""

	
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
		self.session.nav.stopService()
		self["cover"] = Cover()
		self["key_red"] = StaticText(_("Record"))
		self["key_green"] = StaticText(_("Genres"))
		self["key_yellow"] = StaticText(_("Stations"))
		self["key_blue"] = StaticText(_("Favorites"))
		self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
			{
				iPlayableService.evUpdatedInfo: self.__evUpdatedInfo,
				iPlayableService.evUser+10: self.__evAudioDecodeError,
				iPlayableService.evUser+12: self.__evPluginError
			})
		InfoBarSeek.__init__(self, actionmap = "MediaPlayerSeekActions")
		self.mode = self.FAVORITELIST
		self["list"] = SHOUTcastList()
		self["list"].connectSelChanged(self.onSelectionChanged)
		self["statustext"] = Label(_("Getting SHOUTcast genre list..."))
		self["actions"] = ActionMap(["WizardActions", "DirectionActions", "ColorActions", "EPGSelectActions"],
		{
			"ok": self.ok_pressed,
			"back": self.close,
			"input_date_time": self.menu_pressed,
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
			
		}, -1)
		self.stationList = []
		self.stationListIndex = 0
		self.genreList = []
		self.genreListIndex = 0
		self.favoriteList = []
		self.favoriteListIndex = 0

		self.favoriteConfig = Config()
		if os.path.exists(self.FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE)
		else:
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_DEFAULT)
		self.favoriteConfig.entriescount =  ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavouriteConfig()
		self.stationListXML = ""
		self["titel"] = Label()
		self["station"] = Label()
		self["headertext"] = Label()
		self["console"] = Label()
		self.headerTextString = ""
		self.stationListHeader = ""
		self.tunein = ""
		self.searchSHOUTcastString = ""
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self.stationListURL = ""
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.getFavoriteList)

		self.reloadStationListTimer = eTimer()
		self.reloadStationListTimer.timeout.get().append(self.reloadStationListTimerTimeout)
		self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)

		self.visible = True

		global containerStreamripper
		if containerStreamripper is None:
			containerStreamripper = eConsoleAppContainer()

		containerStreamripper.dataAvail.append(self.streamripperDataAvail)
		containerStreamripper.appClosed.append(self.streamripperClosed)

		if containerStreamripper.running():
			self["key_red"].setText(_("Stop record"))
			# just to hear to recording music when starting the plugin...
			self.currentStreamingStation = _("Recording stream station")
			self.playServiceStream("http://localhost:9191")

	def streamripperClosed(self, retval):
		if retval == 0:
			self["console"].setText("")
		self["key_red"].setText(_("Record"))

	def streamripperDataAvail(self, data):
		sData = data.replace('\n','')
		self["console"].setText(sData)

	def stopReloadStationListTimer(self):
		if self.reloadStationListTimer.isActive():
			self.reloadStationListTimer.stop()

	def reloadStationListTimerTimeout(self):
		self.stopReloadStationListTimer()
		if self.mode == self.STATIONLIST:
			print "[SHOUTcast] reloadStationList: %s " % self.stationListURL
			sendUrlCommand(self.stationListURL, None,10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def InputBoxStartRecordingCallback(self, returnValue = None):
		if returnValue:
			recordingLength =  int(returnValue) * 60
			if not os.path.exists(config.plugins.shoutcast.dirname.value):
				os.mkdir(config.plugins.shoutcast.dirname.value)
			args = []
			args.append(self.currentStreamingURL)
			args.append('-d')
			args.append(config.plugins.shoutcast.dirname.value)
			args.append('-r')
			args.append('9191')
			if recordingLength != 0:
				args.append('-l')
				args.append("%d" % int(recordingLength))
			if config.plugins.shoutcast.riptosinglefile.value:
				args.append('-a')
				args.append('-A')
			if not config.plugins.shoutcast.createdirforeachstream.value:
				args.append('-s')
			if config.plugins.shoutcast.addsequenceoutputfile.value:
				args.append('-q')
			cmd = [self.STREAMRIPPER_BIN, self.STREAMRIPPER_BIN] + args
			containerStreamripper.execute(*cmd)
			self["key_red"].setText(_("Stop record"))

	def deleteRecordingConfirmed(self,val):
		if val:
			containerStreamripper.sendCtrlC()

	def red_pressed(self):
		if containerStreamripper.running():
			self.session.openWithCallback(self.deleteRecordingConfirmed, MessageBox, _("Do you really want to stop the recording?"))
		else:
			if len(self.currentStreamingURL) != 0:
				self.session.openWithCallback(self.InputBoxStartRecordingCallback, InputBox, windowTitle = _("Recording length"),  title=_("Enter in minutes (0 means unlimited)"), text="0", type=Input.NUMBER)
			else:
				self.session.open(MessageBox, _("Only running streamings can be recorded!"), type = MessageBox.TYPE_INFO,timeout = 20 )

	def green_pressed(self):
		if self.mode != self.GENRELIST:
			self.stopReloadStationListTimer()
			self.mode = self.GENRELIST
			if len(self.genreList):
				self["headertext"].setText(_("SHOUTcast genre list"))
				self["list"].setMode(self.mode)
				self["list"].setList([ (x,) for x in self.genreList])
				self["list"].moveToIndex(self.genreListIndex)
			else:
				self.getGenreList()
		else:
			self.getGenreList()

	def yellow_pressed(self):
		if self.mode != self.STATIONLIST:
			if len(self.stationList):
				self.mode = self.STATIONLIST
				self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
				self["headertext"].setText(self.headerTextString)
				self["list"].setMode(self.mode)
				self["list"].setList([ (x,) for x in self.stationList])
				self["list"].moveToIndex(self.stationListIndex)
				if self.reloadStationListTimerVar != 0:
					self.reloadStationListTimer.start(60000 * self.reloadStationListTimerVar)

	def blue_pressed(self):
		if self.mode != self.FAVORITELIST:
			self.stopReloadStationListTimer()
			self.getFavoriteList(self.favoriteListIndex)

	def getFavoriteList(self, favoriteListIndex = 0):
		self["statustext"].setText("")
		self.headerTextString = _("Favorite list")
		self["headertext"].setText(self.headerTextString)
		self.mode = self.FAVORITELIST
		self["list"].setMode(self.mode)
		favoriteList = []
		for item in self.favoriteConfig.Entries:
			favoriteList.append(Favorite(configItem=item))
		self["list"].setList([ (x,) for x in favoriteList])
		if len(favoriteList):
			self["list"].moveToIndex(favoriteListIndex)
		self["list"].show()

	def getGenreList(self):
		self["headertext"].setText("")
		self["statustext"].setText(_("Getting SHOUTcast genre list..."))
		self["list"].hide()
		url = "http://yp.shoutcast.com/sbin/newxml.phtml"
		sendUrlCommand(url, None,10).addCallback(self.callbackGenreList).addErrback(self.callbackGenreListError)

	def callbackGenreList(self, xmlstring):
		self["headertext"].setText(_("SHOUTcast genre list"))
		self.genreListIndex = 0
		self.mode = self.GENRELIST
		self["list"].setMode(self.mode)
		self.genreList = self.fillGenreList(xmlstring)
		self["statustext"].setText("")
		self["list"].setList([ (x,) for x in self.genreList])
		if len(self.genreList):
			self["list"].moveToIndex(self.genreListIndex)
		self["list"].show()

	def callbackGenreListError(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(_("%s\nPress green-button to try again...") % str(error.getErrorMessage()))
			except: pass
	
		
	def fillGenreList(self,xmlstring):
		genreList = []
		try:
			root = xml.etree.cElementTree.fromstring(xmlstring)
		except: return []
		for childs in root.findall("genre"):
			genreList.append(SHOUTcastGenre(name = childs.get("name")))
		return genreList

	
	def onSelectionChanged(self):
		pass
		# till I find a better solution
#		if self.mode == self.STATIONLIST:
#			self.stationListIndex = self["list"].getCurrentIndex()
#		elif self.mode == self.FAVORITELIST:
#			self.favoriteListIndex = self["list"].getCurrentIndex()
#		elif self.mode == self.GENRELIST:
#			self.genreListIndex = self["list"].getCurrentIndex()

	def ok_pressed(self):
		if self.visible:
			sel = None
			try:
				sel = self["list"].l.getCurrentSelection()[0]
			except:return
			if sel is None:
				return
			else:
				if self.mode == self.GENRELIST:
					self.genreListIndex = self["list"].getCurrentIndex()
					self.getStationList(sel.name)
				elif self.mode == self.STATIONLIST:
					self.stationListIndex = self["list"].getCurrentIndex()
					self.stopPlaying()
					url = "http://yp.shoutcast.com%s?id=%s" % (self.tunein, sel.id)
					self["list"].hide()
					self["statustext"].setText(_("Getting streaming data from\n%s") % sel.name)
					self.currentStreamingStation = sel.name
					sendUrlCommand(url, None,10).addCallback(self.callbackPLS).addErrback(self.callbackStationListError)
				elif self.mode == self.FAVORITELIST:
					self.favoriteListIndex = self["list"].getCurrentIndex()
					if sel.configItem.type.value == "url":
						self.stopPlaying()
						self["headertext"].setText(self.headerTextString)
						self.currentStreamingStation = sel.configItem.name.value
						self.playServiceStream(sel.configItem.text.value)
					elif sel.configItem.type.value == "pls":
						self.stopPlaying()
						url = sel.configItem.text.value
						self["list"].hide()
						self["statustext"].setText(_("Getting streaming data from\n%s") % sel.configItem.name.value)
						self.currentStreamingStation = sel.configItem.name.value
						sendUrlCommand(url, None,10).addCallback(self.callbackPLS).addErrback(self.callbackStationListError)
					elif sel.configItem.type.value == "genre":
						self.getStationList(sel.configItem.name.value)
				elif self.mode == self.SEARCHLIST and self.searchSHOUTcastString != "":
					self.searchSHOUTcast(self.searchSHOUTcastString)
		else:
			self.showWindow()

	def stopPlaying(self):
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self["headertext"].setText("")
		self["titel"].setText("")
		self["station"].setText("")
		self.summaries.setText("")
		self["cover"].hide()
		self.session.nav.stopService()

	def callbackPLS(self, result):
		self["headertext"].setText(self.headerTextString)
		found = False
		parts = string.split(result,"\n")
		for lines in parts:
			if lines.find("File1=") != -1:
				line = string.split(lines,"File1=")
				found = True
				self.playServiceStream(line[-1].rstrip().strip())
				
		if found:
			self["statustext"].setText("")
			self["list"].show()
		else:
			self.currentStreamingStation = ""
			self["statustext"].setText(_("No streaming data found..."))

	def getStationList(self,genre):
		self.stationListHeader = _("genre %s") % genre
		self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
		self["headertext"].setText("")
		self["statustext"].setText(_("Getting %s") %  self.headerTextString)
		self["list"].hide()
		self.stationListURL = "http://yp.shoutcast.com/sbin/newxml.phtml?genre=%s" % genre
		self.stationListIndex = 0
		sendUrlCommand(self.stationListURL, None,10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def callbackStationList(self, xmlstring):
		self.searchSHOUTcastString = ""
		self.stationListXML = xmlstring
		self["headertext"].setText(self.headerTextString)
		self.mode = self.STATIONLIST
		self["list"].setMode(self.mode)
		self.stationList = self.fillStationList(xmlstring)
		self["statustext"].setText("")
		self["list"].setList([ (x,) for x in self.stationList])
		if len(self.stationList):
			self["list"].moveToIndex(self.stationListIndex)
		self["list"].show()
		if self.reloadStationListTimerVar != 0:
			self.reloadStationListTimer.start(1000 * 60)

	def fillStationList(self,xmlstring):
		stationList = []
		try:
			root = xml.etree.cElementTree.fromstring(xmlstring)
		except: return []
		config_bitrate = int(config.plugins.shoutcast.streamingrate.value)
		for childs in root.findall("tunein"):
			self.tunein = childs.get("base")
		for childs in root.findall("station"):
			try: bitrate = int(childs.get("br"))
			except: bitrate = 0
			if bitrate >= config_bitrate:
				stationList.append(SHOUTcastStation(name = childs.get("name"), 
									mt = childs.get("mt"), id = childs.get("id"), br = childs.get("br"), 
									genre = childs.get("genre"), ct = childs.get("ct"), lc = childs.get("lc")))
		return stationList

	def menu_pressed(self):
		if not self.visible:
			self.showWindow()
		options = [(_("Config"), self.config),(_("Search"), self.search),]
		if self.mode == self.FAVORITELIST and self.getSelectedItem() is not None:
			options.extend(((_("rename current selected favorite"), self.renameFavorite),))
			options.extend(((_("remove current selected favorite"), self.removeFavorite),))
		elif self.mode == self.GENRELIST and self.getSelectedItem() is not None:
			options.extend(((_("Add current selected genre to favorite"), self.addGenreToFavorite),))
		elif self.mode == self.STATIONLIST and self.getSelectedItem() is not None:
			options.extend(((_("Add current selected station to favorite"), self.addStationToFavorite),))
		if len(self.currentStreamingURL) != 0:
			options.extend(((_("Add current playing stream to favorite"), self.addCurrentStreamToFavorite),))
		options.extend(((_("Hide"), self.hideWindow),))
		self.session.openWithCallback(self.menuCallback, ChoiceBox,list = options)

	def menuCallback(self, ret):
		ret and ret[1]()

	def hideWindow(self):
		self.visible = False
		self.hide()

	def showWindow(self):
		self.visible = True
		self.show()

	def addGenreToFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.addFavorite(name = sel.name, text = sel.name, favoritetype = "genre")			

	def addStationToFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.addFavorite(name = sel.name, text = "http://yp.shoutcast.com%s?id=%s" % (self.tunein, sel.id), favoritetype = "pls", audio = sel.mt, bitrate = sel.br)			

	def addCurrentStreamToFavorite(self):
		self.addFavorite(name = self.currentStreamingStation, text = self.currentStreamingURL, favoritetype = "url")

	def addFavorite(self, name = "", text = "", favoritetype = "", audio = "", bitrate = ""):
		self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
		self.favoriteConfig.entriescount.save()
		newFavorite = self.initFavouriteEntryConfig()
		newFavorite.name.value = name
		newFavorite.text.value = text
		newFavorite.type.value = favoritetype
		newFavorite.audio.value = audio
		newFavorite.bitrate.value = bitrate
		newFavorite.save()
		self.favoriteConfig.saveToFile(self.FAVORITE_FILE)

	def renameFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.session.openWithCallback(self.renameFavoriteFinished, VirtualKeyBoard, title = _("Enter new name for favorite item"), text = sel.configItem.name.value)

	def renameFavoriteFinished(self, text = None):
		if text:
			sel = self.getSelectedItem()
			sel.configItem.name.value = text
			sel.configItem.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)
			self.favoriteListIndex = 0
			self.getFavoriteList()


	def removeFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value - 1
			self.favoriteConfig.entriescount.save()
			self.favoriteConfig.Entries.remove(sel.configItem)
			self.favoriteConfig.Entries.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)
			self.favoriteListIndex = 0
			self.getFavoriteList()

	def search(self):
		self.session.openWithCallback(self.searchSHOUTcast, VirtualKeyBoard, title = _("Enter text to search for"))

	def searchSHOUTcast(self, searchstring = None):
		if searchstring:
			self.stopReloadStationListTimer()
			self.stationListHeader = _("search-criteria %s") % searchstring
			self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
			self["headertext"].setText("")
			self["statustext"].setText(_("Searching SHOUTcast for %s...") % searchstring)
			self["list"].hide()
			self.stationListURL = "http://yp.shoutcast.com/sbin/newxml.phtml?search=%s" % searchstring
			self.mode = self.SEARCHLIST
			self.searchSHOUTcastString = searchstring
			self.stationListIndex = 0
			sendUrlCommand(self.stationListURL, None,10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def config(self):
		self.stopReloadStationListTimer()
		self.session.openWithCallback(self.setupFinished, SHOUTcastSetup)

	def setupFinished(self, result):
		if result:
			if self.mode == self.STATIONLIST:
				self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)
				self.stationListIndex = 0
				self.callbackStationList(self.stationListXML)

	def callbackStationListError(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(_("%s\nPress OK to try again...") % str(error.getErrorMessage()))
			except: pass

	def Error(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(str(error.getErrorMessage()))
			except: pass
	
	def __onClose(self):
		self.stopReloadStationListTimer()
		self.session.nav.playService(self.CurrentService)
		containerStreamripper.dataAvail.remove(self.streamripperDataAvail)
		containerStreamripper.appClosed.remove(self.streamripperClosed)

	def GoogleImageCallback(self, result):
		foundPos = result.find("imgres?imgurl=")
		foundPos2 = result.find("&imgrefurl=")
		if foundPos != -1 and foundPos2 != -1:
			print "[SHOUTcast] downloading cover from %s " % result[foundPos+14:foundPos2]
			downloadPage(result[foundPos+14:foundPos2] ,"/tmp/.cover").addCallback(self.coverDownloadFinished).addErrback(self.coverDownloadFailed)

	def coverDownloadFailed(self,result):
        	print "[SHOUTcast] cover download failed: %s " % result
		self["cover"].hide()

	def coverDownloadFinished(self,result):
		print "[SHOUTcast] cover download finished"
		self["cover"].updateIcon("/tmp/.cover")
		self["cover"].show()
		
	def __evUpdatedInfo(self):
		sTitle = ""
		currPlay = self.session.nav.getCurrentService()
		if currPlay is not None:
			sTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle)
			if (len(sTitle) !=0):
				url = "http://images.google.de/images?q=%s&btnG=Bilder-Suche" % quote(sTitle)
				sendUrlCommand(url, None,10).addCallback(self.GoogleImageCallback).addErrback(self.Error)
		if len(sTitle) == 0:
			sTitle = "n/a"
		title = _("Title: %s") % sTitle
		self["titel"].setText(title)
		self.summaries.setText(title)


	def __evAudioDecodeError(self):
		currPlay = self.session.nav.getCurrentService()
		sAudioType = currPlay.info().getInfoString(iServiceInformation.sUser+10)
		print "[SHOUTcast __evAudioDecodeError] audio-codec %s can't be decoded by hardware" % (sAudioType)
		self.session.open(MessageBox, _("This Dreambox can't decode %s streams!") % sAudioType, type = MessageBox.TYPE_INFO,timeout = 20 )

	def __evPluginError(self):
		currPlay = self.session.nav.getCurrentService()
		message = currPlay.info().getInfoString(iServiceInformation.sUser+12)
		print "[SHOUTcast __evPluginError]" , message
		self.session.open(MessageBox, message, type = MessageBox.TYPE_INFO,timeout = 20 )

	def doEofInternal(self, playing):
		self.stopPlaying()

	def checkSkipShowHideLock(self):
		# nothing to do here
		pass
	
	def playServiceStream(self, url):
		self.session.nav.stopService()
		sref = eServiceReference(4097, 0, url)
		self.session.nav.playService(sref)
		self.currentStreamingURL = url
		self["titel"].setText(_("Title: n/a"))
		self["station"].setText(_("Station: %s") % self.currentStreamingStation)

	def createSummary(self):
		return SHOUTcastLCDScreen

	def initFavouriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) -1
		self.favoriteConfig.Entries[i].name = ConfigText(default = "")
		self.favoriteConfig.Entries[i].text = ConfigText(default = "")
		self.favoriteConfig.Entries[i].type = ConfigText(default = "")
		self.favoriteConfig.Entries[i].audio = ConfigText(default = "")
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default = "")
		return self.favoriteConfig.Entries[i]

	def initFavouriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavouriteEntryConfig()
				i += 1

	def getSelectedItem(self):
		sel = None
		try:
			sel = self["list"].l.getCurrentSelection()[0]
		except:return None
		return sel
from Screens.Screen import Screen

from Components.config import config
from Components.config import Config
from Components.config import ConfigSelection
from Components.config import ConfigText
from Components.config import getConfigListEntry
from Components.ConfigList import ConfigListScreen
from Components.ActionMap import ActionMap
from Components.Button import Button

from ConfigTextWithSuggestions import ConfigTextWithSuggestions

from . import _

searchContext = Config()
searchContext.searchTerm = ConfigTextWithSuggestions("", False, threaded=True)
searchContext.orderBy = ConfigSelection([("relevance", _("Relevance")),
                                         ("viewCount", _("View Count")),
                                         ("published", _("Published")),
                                         ("rating", _("Rating"))], "relevance")
searchContext.time = ConfigSelection([("all_time", _("All Time")),
                                      ("this_month", _("This Month")),
                                      ("this_week", _("This Week")),
                                      ("today", _("Today"))], "all_time")
searchContext.racy = ConfigSelection([("include", _("Yes")),
                                      ("exclude", _("No"))], "exclude")
searchContext.categories = ConfigSelection(
    [(None, _("All")), ("Autos", _("Autos & Vehicles")), ("Music", _("Music")),
     ("Animals", _("Pets & Animals")), ("Sports", _("Sports")),
     ("Travel", _("Travel & Events")), ("Shortmov", _("Short Movies")),
Ejemplo n.º 26
0
class tuneinGenresThumb(StreamsThumbCommon):
	def __init__(self, session, action, value, url):
		self.defaultImg = 'Extensions/OnDemand/icons/FolderIcon.png'
		
		self.showWMA = str(config.ondemand.ShowiRadioWMA.value)
		self.showDefault = str(config.ondemand.ShowTuneinDefault.value)
		self.showIcon = str(config.ondemand.ShowTuneinLogos.value)

		if self.showIcon == 'True':		
			if self.showDefault == 'False':
				self.defaultImg = ''
			
		self.favoriteConfig = Config()
		if os_path.exists(FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(FAVORITE_FILE)

		self.favoriteConfig.entriescount = ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavoriteConfig()
		self.genreList = []
		self.getGenreList(self.genreList)

		StreamsThumbCommon.__init__(self, session, action, value, url)

		self.skin = """
				<screen position="0,0" size="e,e" flags="wfNoBorder" >
					<widget name="lab1" position="0,0" size="e,e" font="Regular;24" halign="center" valign="center" transparent="0" zPosition="5" />
					<widget source="Title" render="Label" position="20,0" size="e,50" font="Regular;32" />
					<widget name="list" position="0,50" size="e,e-50" scrollbarMode="showOnDemand" transparent="1" />
					<ePixmap pixmap="skin_default/buttons/green.png" position="800,10" size="40,40" transparent="1" alphatest="on" />
					<widget source="key_green" render="Label" position="810,0" zPosition="1" size="200,40" font="Regular;20" valign="center" halign="center" transparent="1" />
				</screen>"""

		self["key_green"] = StaticText(_("Add to Favorites"))
		
		self["genreActions"] = ActionMap(["ColorActions"],
		{
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
		
		}, -1)

	def layoutFinished(self):
		self.setTitle("Tunein Radio Player: Listings for " +self.title)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def red_pressed(self):
		pass

	def green_pressed(self):
		date1 = self["list"].l.getCurrentSelection()[0]
		name = self["list"].l.getCurrentSelection()[1]
		short = self["list"].l.getCurrentSelection()[2]
		channel = self["list"].l.getCurrentSelection()[3]
		stream = self["list"].l.getCurrentSelection()[4]
		icon = self["list"].l.getCurrentSelection()[5]
		duration = self["list"].l.getCurrentSelection()[6]	
		exists = 'False'

		if (stream != 'None') and (channel != 'link'):
			for item in self.favoriteConfig.Entries:
				if str(item.text.value) == str(stream):
					exists = 'True'

			if exists == 'False':
				result = self.addFavorite(name=name, text=stream, favoritetype='tunein', audio=duration, bitrate=date1, icon=icon)
				if result == 0:
					self.session.open(MessageBox, _('Station saved to Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
				else:
					self.session.open(MessageBox, _('Station save failed, please check the Debug logs!'), type=MessageBox.TYPE_INFO, timeout=3)
			else:
				self.session.open(MessageBox, _('Station Already Saved in Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
				pass
		else:
			self.session.open(MessageBox, _('Selection does not contain a stream!'), type=MessageBox.TYPE_INFO, timeout=3)
			pass

	def yellow_pressed(self):
		pass

	def blue_pressed(self):
		pass

#----------------------------------------------------------------------------------------------------------------------------------------#

	def addFavorite(self, name = '', text = '', favoritetype = '', audio = '', bitrate = '', icon = ''):
		try:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
			self.favoriteConfig.entriescount.save()
			newFavorite = self.initFavoriteEntryConfig()
			newFavorite.name.value = name
			newFavorite.text.value = text
			newFavorite.type.value = favoritetype
			newFavorite.audio.value = audio
			newFavorite.bitrate.value = bitrate
			newFavorite.icon.value = icon
			newFavorite.save()
			self.favoriteConfig.saveToFile(FAVORITE_FILE)
			return 0
		except (Exception) as exception:
			print 'addFavorite: Error saving to Favorites: ', exception
			return -1

	def initFavoriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) - 1
		self.favoriteConfig.Entries[i].name = ConfigText(default='')
		self.favoriteConfig.Entries[i].text = ConfigText(default='')
		self.favoriteConfig.Entries[i].type = ConfigText(default='')
		self.favoriteConfig.Entries[i].audio = ConfigText(default='')
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default='')
		self.favoriteConfig.Entries[i].icon = ConfigText(default='')
		return self.favoriteConfig.Entries[i]

	def initFavoriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavoriteEntryConfig()
				i += 1

#----------------------------------------------------------------------------------------------------------------------------------------#

	def setupCallback(self, retval = None):
		if retval == 'cancel' or retval is None:
			return
		elif retval == 'search':
			self.timerCmd = self.TIMER_CMD_VKEY
			self.cbTimer.start(10)
		else:
			self.getTuneinMediaData(self.mediaList, self.url)
			if len(self.mediaList) == 0:
				self.session.open(MessageBox, _('Sorry, No Stations Found!'), type=MessageBox.TYPE_INFO, timeout=5)
			self.updateMenu()

	def keyboardCallback(self, callback = None):
		if callback is not None and len(callback):
			self.setTitle("Tunein Radio Player: Search Listings for " +callback)
			stationsearch = callback.replace(' ', '+')
			searchurl = 'http://opml.radiotime.com/Search.ashx?query=%s' % (stationsearch)
			self.getTuneinMediaData(self.mediaList, searchurl)
			self.updateMenu()
			if len(self.mediaList) == 0:
				self.session.openWithCallback(self.close, MessageBox, _("No items matching your search criteria were found"), MessageBox.TYPE_INFO, timeout=5)
		else:
			self.close()

#----------------------------------------------------------------------------------------------------------------------------------------#

	def go(self):
		showID = self["list"].l.getCurrentSelection()[4]
		showName = self["list"].l.getCurrentSelection()[1]
		children = self["list"].l.getCurrentSelection()[3]

		if children == "link":
			self.session.open(tuneinGenresThumb, showID, showName, showID)
		elif showID != 'None':
			fileUrl = findPlayUrl(showID, 'tunein', self.showWMA)
			
			if fileUrl:
				fileRef = eServiceReference(4097,0,fileUrl)
				fileRef.setName (showName)
#				lastservice = self.session.nav.getCurrentlyPlayingServiceOrGroup()
				self.session.open(MoviePlayer, fileRef, None)
				
				# TODO: Find out how to use this!
				#NavigationInstance.instance.playService(fileRef)
			else:
				self.session.open(MessageBox, _('Sorry, unable to find playable stream!'), type=MessageBox.TYPE_INFO, timeout=5)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def getTuneinMediaData(self, weekList, url):

		short = ''
		name = ''
		date1 = ''
		stream = ''
		channel = ''
		icon = ''
		duration = ''

		try:
			# Read the URL for the selected genre on the Main Menu.
			xml = wgetUrl(url)

			# Parse the XML with elementTree
			tree = ET.fromstring(xml)

			# Find the first element <outline>
			for elem in tree.iter('outline'):
				# Iterate through the elements
				name_tmp = str(elem.get('text'))
				name_split = name_tmp.rsplit('(',1)
				name = tidyString(name_split[0])
				avail = str(elem.get('key'))
				
				if (avail != 'unavailable') and (name != 'This program is not available'):
					genreID = str(elem.get('genre_id'))
					genre = self.getGenreName(genreID)
					stream = str(elem.get('URL'))
					channel = str(elem.get('type'))
					formats = str(elem.get('formats'))

					if channel == 'link':
						date1 = 'More --->'
						short = '\nPress OK for sub items of '+name
						duration = ''
					else:
						bitrate = str(elem.get('bitrate'))
						if bitrate == 'None':
							date1 = _("Bitrate: Unknown")
						else:
							date1 = _("Bitrate: ")+bitrate+" kbps"

						short_tmp = str(elem.get('subtext'))
						if genre != 'None':
							short = _("Recently Played: ")+checkUnicode(short_tmp)+_("\n\nGenre: ")+genre
						else:
							short = _("Recently Played: ")+checkUnicode(short_tmp)

						if formats == 'None':
							duration = _("Audio: Unknown")
						else:
							duration = _("Audio: ")+formats

					if self.showIcon == 'True':
						icon = str(elem.get('image'))
						if icon == 'None':
							icon = ''
					else:
						icon = ''

					if (channel != 'None'):
						if (self.showWMA == 'False' and formats =='wma'):
							print 'getTuneinMediaData: Not showing WMA: showWMA: ', self.showWMA
							pass
						else:
							weekList.append((date1, name, short, channel, stream, icon, duration, False))

		except (Exception) as exception:
			print 'getTuneinMediaData: Error getting Media info: ', exception

#----------------------------------------------------------------------------------------------------------------------------------------#

	def getGenreList(self, genreList):
		url = 'http://opml.radiotime.com/Describe.ashx?c=genres'
		# Read the URL for the selected category on the Main Menu.
		try:
			# Read the Genre List from Shoutcast.
			xml = wgetUrl(url)

			# Make sure data is returned before attempting to parse.
			if xml:
				# Parse the XML with elementTree
				tree = ET.fromstring(xml)

				# Find the first element <outline>
				for elem in tree.iter('outline'):
					# Iterate through the elements
					genre = str(elem.get('text'))
					id = str(elem.get('guide_id'))
					genreList.append((id, genre))

		except (Exception) as exception:
			print 'getGenreList: Error parsing genres: ', exception

	def getGenreName(self, genreID):
		try:
			genreName = 'None'

			for genre in self.genreList:
				if genre[0] == genreID:
					genreName = genre[1]
					break

			return genreName
		except (Exception) as exception:
			print 'getGenreName: Error Searching genres: ', exception
			return 'None'
Ejemplo n.º 27
0
class shoutGenresThumb(StreamsThumbCommon):
	def __init__(self, session, action, value, url):
		self.defaultImg = 'Extensions/OnDemand/icons/SHOUTcast.png'
		
		self.showWMA = str(config.ondemand.ShowiRadioWMA.value)
		self.showDefault = str(config.ondemand.ShowShoutcastDefault.value)
		self.showIcon = str(config.ondemand.ShowShoutcastLogos.value)

		if self.showIcon == 'True':		
			if self.showDefault == 'False':
				self.defaultImg = ''

		self.favoriteConfig = Config()
		if os_path.exists(FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(FAVORITE_FILE)

		self.favoriteConfig.entriescount = ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavoriteConfig()

		StreamsThumbCommon.__init__(self, session, action, value, url)

		self.skin = """
				<screen position="0,0" size="e,e" flags="wfNoBorder" >
					<widget name="lab1" position="0,0" size="e,e" font="Regular;24" halign="center" valign="center" transparent="0" zPosition="5" />
					<widget source="Title" render="Label" position="20,0" size="e,50" font="Regular;32" />
					<widget name="list" position="0,50" size="e,e-50" scrollbarMode="showOnDemand" transparent="1" />
					<ePixmap pixmap="ViX-Common/buttons/green.png" position="800,10" size="40,40" transparent="1" alphatest="on" />
					<widget source="key_green" render="Label" position="810,0" zPosition="1" size="200,40" font="Regular;20" valign="center" halign="center" transparent="1" />
				</screen>"""

		self["key_green"] = StaticText(_("Add to Favorites"))
		
		self["genreActions"] = ActionMap(["ColorActions"],
		{
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
		
		}, -1)

	def layoutFinished(self):
		self.setTitle("SHOUTcast Radio Player: Listings for " +self.title)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def red_pressed(self):
		pass

	def green_pressed(self):
		date1 = self["list"].l.getCurrentSelection()[0]
		name = self["list"].l.getCurrentSelection()[1]
		short = self["list"].l.getCurrentSelection()[2]
		channel = self["list"].l.getCurrentSelection()[3]
		stream = self["list"].l.getCurrentSelection()[4]
		icon = self["list"].l.getCurrentSelection()[5]
		duration = self["list"].l.getCurrentSelection()[6]
		exists = 'False'

		if stream is not None:
			for item in self.favoriteConfig.Entries:
				if str(item.text.value) == str(stream):
					exists = 'True'

			if exists == 'False':
				result = self.addFavorite(name=name, text=stream, favoritetype='shoutcast', audio=duration, bitrate=date1, icon=icon)
				if result == 0:
					self.session.open(MessageBox, _('Station saved to Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
				else:
					self.session.open(MessageBox, _('Station save failed, please check the Debug logs!'), type=MessageBox.TYPE_INFO, timeout=3)
			else:
				self.session.open(MessageBox, _('Station Already Saved in Favorites!'), type=MessageBox.TYPE_INFO, timeout=3)
				pass
		else:
			self.session.open(MessageBox, _('Selection does not contain a stream!'), type=MessageBox.TYPE_INFO, timeout=3)
			pass

	def yellow_pressed(self):
		pass

	def blue_pressed(self):
		pass

#----------------------------------------------------------------------------------------------------------------------------------------#

	def addFavorite(self, name = '', text = '', favoritetype = '', audio = '', bitrate = '', icon = ''):
		try:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
			self.favoriteConfig.entriescount.save()
			newFavorite = self.initFavoriteEntryConfig()
			newFavorite.name.value = name
			newFavorite.text.value = text
			newFavorite.type.value = favoritetype
			newFavorite.audio.value = audio
			newFavorite.bitrate.value = bitrate
			newFavorite.icon.value = icon
			newFavorite.save()
			self.favoriteConfig.saveToFile(FAVORITE_FILE)
			return 0
		except (Exception) as exception:
			print 'addFavorite: Error saving to Favorites: ', exception
			return -1

	def getFavoriteList(self):
		self.getFavMediaData(self.mediaList, self.url)
		if len(self.mediaList) == 0:
			self.mediaProblemPopup("No Stations Found!")
		self.updateMenu()

	def initFavoriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) - 1
		self.favoriteConfig.Entries[i].name = ConfigText(default='')
		self.favoriteConfig.Entries[i].text = ConfigText(default='')
		self.favoriteConfig.Entries[i].type = ConfigText(default='')
		self.favoriteConfig.Entries[i].audio = ConfigText(default='')
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default='')
		self.favoriteConfig.Entries[i].icon = ConfigText(default='')
		return self.favoriteConfig.Entries[i]

	def initFavoriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavoriteEntryConfig()
				i += 1

#----------------------------------------------------------------------------------------------------------------------------------------#

	def setupCallback(self, retval = None):
		if retval == 'cancel' or retval is None:
			return
			
		elif retval == 'search':
			self.timerCmd = self.TIMER_CMD_VKEY
			self.cbTimer.start(10)

		else:
			genresearch = self.url.replace(' All', '')
			genresearch = genresearch.replace(' ', '+')
			stationurl = 'http://api.shoutcast.com/legacy/genresearch?k=%s&genre=%s' % (devid, genresearch)
			
			self.getShoutcastMediaData(self.mediaList, stationurl)
			if len(self.mediaList) == 0:
				self.mediaProblemPopup("No Stations Found!")
			self.updateMenu()

	def keyboardCallback(self, callback = None):
		if callback is not None and len(callback):
			self.setTitle("SHOUTcast Radio Player: Search Listings for " +callback)
			
			genresearch = callback.replace(' ', '+')
			searchurl = 'http://api.shoutcast.com/legacy/stationsearch?k=%s&search=%s' % (devid, str(genresearch))
			
			self.getShoutcastMediaData(self.mediaList, searchurl)
			self.updateMenu()
			if len(self.mediaList) == 0:
				self.session.openWithCallback(self.close, MessageBox, _("No items matching your search criteria were found"), MessageBox.TYPE_INFO, timeout=5, simple = True)
		else:
			self.close()

	def go(self):
		showID = self["list"].l.getCurrentSelection()[4]
		showName = self["list"].l.getCurrentSelection()[1]

		if showID:
			fileUrl = findPlayUrl(showID, 'shoutcast', self.showWMA)
			
			if fileUrl:
				fileRef = eServiceReference(4097,0,fileUrl)
				fileRef.setName (showName)
				lastservice = self.session.nav.getCurrentlyPlayingServiceOrGroup()
				self.session.open(MoviePlayer, fileRef, None, lastservice)
			else:
				self.session.open(MessageBox, _('Sorry, unable to find playable stream!'), type=MessageBox.TYPE_INFO, timeout=5)

#----------------------------------------------------------------------------------------------------------------------------------------#

	def getShoutcastMediaData(self, weekList, url):

		plsurl = 'http://yp.shoutcast.com/sbin/tunein-station.pls?id='
		short = ''
		name = ''
		date1 = ''
		stream = ''
		channel = ''
		icon = ''
		duration = ''

		try:
			# Read the URL for the selected genre on the Main Menu.
			xml = wgetUrl(url)

			# Make sure reading the URL returned data.
			if xml:
				# Parse the XML with elementTree
				tree = ET.fromstring(xml)

				# Find the first element <station>
				for elem in tree.iter('station'):
					# Iterate through the elements
					name_tmp = str(elem.get('name'))
					name = checkUnicode(name_tmp)
					id = str(elem.get('id'))
					stream = plsurl+id
					short_tmp = str(elem.get('ct'))
					genre = str(elem.get('genre'))
					bitrate = str(elem.get('br'))
					audio = str(elem.get('mt'))
					
					if genre != 'None':
						short = _("Recently Played: ")+checkUnicode(short_tmp)+_("\n\nGenre: ")+genre
					else:
						short = _("Recently Played: ")+checkUnicode(short_tmp)

					if bitrate != 'None':
						date1 = _("Bitrate: ")+bitrate+" kbps"
					else:
						date1 = _("Bitrate: Unknown")
					
					if audio != 'None':
						duration = _("Audio: ")+audio
					else:
						duration = _("Audio: Unknown")

					weekList.append((date1, name, short, channel, stream, icon, duration, False))

		except (Exception) as exception:
			print 'getShoutcastMediaData: Error getting Media info: ', exception
Ejemplo n.º 28
0
class SHOUTcastWidget(Screen, InfoBarSeek):

	GENRELIST = 0
	STATIONLIST = 1
	FAVORITELIST = 2
	SEARCHLIST = 3

	STREAMRIPPER_BIN = '/usr/bin/streamripper'

	FAVORITE_FILE_DEFAULT = '/usr/lib/enigma2/python/Plugins/Extensions/SHOUTcast/favorites'
	FAVORITE_FILE = '/usr/lib/enigma2/python/Plugins/Extensions/SHOUTcast/favorites.user'

	sz_w = getDesktop(0).size().width() - 90
	sz_h = getDesktop(0).size().height() - 100
	skin = """
		<screen name="SHOUTcastWidget" position="center,65" title="%s" size="%d,%d">
			<ePixmap position="5,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
			<ePixmap position="150,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
			<ePixmap position="295,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" />
			<ePixmap position="440,0" zPosition="4" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" />
			<ePixmap pixmap="skin_default/buttons/key_menu.png" position="585,10" zPosition="0" size="35,25" alphatest="on" />
			<widget render="Label" source="key_red" position="5,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_green" position="150,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_yellow" position="295,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget render="Label" source="key_blue" position="440,0" size="140,40" zPosition="5" valign="center" halign="center" backgroundColor="red" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
			<widget name="headertext" position="5,47" zPosition="1" size="%d,23" font="Regular;20" transparent="1"  backgroundColor="#00000000"/>
			<widget name="statustext" position="5,240" zPosition="1" size="%d,90" font="Regular;20" halign="center" valign="center" transparent="0"  backgroundColor="#00000000"/>
			<widget name="list" position="5,80" zPosition="2" size="%d,%d" scrollbarMode="showOnDemand" transparent="0"  backgroundColor="#00000000"/>
			<widget name="titel" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="station" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="console" position="115,%d" zPosition="1" size="%d,40" font="Regular;18" transparent="1"  backgroundColor="#00000000"/>
			<widget name="cover" zPosition="2" position="5,%d" size="102,110" alphatest="blend" />
			<ePixmap position="%d,41" zPosition="4" size="120,35" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/SHOUTcast/shoutcast-logo1-fs8.png" transparent="1" alphatest="on" />
		</screen>""" %(
			config.plugins.shoutcast.name.value + " "  + _("Ver.") + " " + shoutcast_pluginversion, # title
			sz_w, sz_h, # size
			sz_w - 135, # size headertext
			sz_w - 100, # size statustext
			sz_w - 10, sz_h - 205, # size list
			sz_h - 105, # position titel
			sz_w - 125, # size titel
			sz_h - 70, # position station
			sz_w - 125, # size station
			sz_h - 25, # position console
			sz_w - 125, # size console
			sz_h - 105, # position cover
			sz_w - 125, # position logo
			)
	
	def __init__(self, session):
		self.session = session
		Screen.__init__(self, session)
		self.CurrentService = self.session.nav.getCurrentlyPlayingServiceReference()
		self.session.nav.stopService()
		self["cover"] = Cover()
		self["key_red"] = StaticText(_("Record"))
		self["key_green"] = StaticText(_("Genres"))
		self["key_yellow"] = StaticText(_("Stations"))
		self["key_blue"] = StaticText(_("Favorites"))
		self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
			{
				iPlayableService.evUpdatedInfo: self.__evUpdatedInfo,
				iPlayableService.evUser+10: self.__evAudioDecodeError,
				iPlayableService.evUser+12: self.__evPluginError
			})
		InfoBarSeek.__init__(self, actionmap = "MediaPlayerSeekActions")
		self.mode = self.FAVORITELIST
		self["list"] = SHOUTcastList()
		self["list"].connectSelChanged(self.onSelectionChanged)
		self["statustext"] = Label(_("Getting SHOUTcast genre list..."))
		self["actions"] = ActionMap(["WizardActions", "DirectionActions", "ColorActions", "EPGSelectActions"],
		{
			"ok": self.ok_pressed,
			"back": self.close,
			"input_date_time": self.menu_pressed,
			"red": self.red_pressed,
			"green": self.green_pressed,
			"yellow": self.yellow_pressed,
			"blue": self.blue_pressed,
			
		}, -1)
		self.stationList = []
		self.stationListIndex = 0
		self.genreList = []
		self.genreListIndex = 0
		self.favoriteList = []
		self.favoriteListIndex = 0

		self.favoriteConfig = Config()
		if os.path.exists(self.FAVORITE_FILE):
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE)
		else:
			self.favoriteConfig.loadFromFile(self.FAVORITE_FILE_DEFAULT)
		self.favoriteConfig.entriescount =  ConfigInteger(0)
		self.favoriteConfig.Entries = ConfigSubList()
		self.initFavouriteConfig()
		self.stationListXML = ""
		self["titel"] = Label()
		self["station"] = Label()
		self["headertext"] = Label()
		self["console"] = Label()
		self.headerTextString = ""
		self.stationListHeader = ""
		self.tunein = ""
		self.searchSHOUTcastString = ""
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self.stationListURL = ""
		self.onClose.append(self.__onClose)
		self.onLayoutFinish.append(self.getFavoriteList)

		self.reloadStationListTimer = eTimer()
		self.reloadStationListTimer.timeout.get().append(self.reloadStationListTimerTimeout)
		self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)

		self.visible = True

		global containerStreamripper
		if containerStreamripper is None:
			containerStreamripper = eConsoleAppContainer()

		containerStreamripper.dataAvail.append(self.streamripperDataAvail)
		containerStreamripper.appClosed.append(self.streamripperClosed)

		if containerStreamripper.running():
			self["key_red"].setText(_("Stop record"))
			# just to hear to recording music when starting the plugin...
			self.currentStreamingStation = _("Recording stream station")
			self.playServiceStream("http://localhost:9191")

	def streamripperClosed(self, retval):
		if retval == 0:
			self["console"].setText("")
		self["key_red"].setText(_("Record"))

	def streamripperDataAvail(self, data):
		sData = data.replace('\n','')
		self["console"].setText(sData)

	def stopReloadStationListTimer(self):
		if self.reloadStationListTimer.isActive():
			self.reloadStationListTimer.stop()

	def reloadStationListTimerTimeout(self):
		self.stopReloadStationListTimer()
		if self.mode == self.STATIONLIST:
			print "[SHOUTcast] reloadStationList: %s " % self.stationListURL
			sendUrlCommand(self.stationListURL, None,10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def InputBoxStartRecordingCallback(self, returnValue = None):
		if returnValue:
			recordingLength =  int(returnValue) * 60
			if not os.path.exists(config.plugins.shoutcast.dirname.value):
				os.mkdir(config.plugins.shoutcast.dirname.value)
			args = []
			args.append(self.currentStreamingURL)
			args.append('-d')
			args.append(config.plugins.shoutcast.dirname.value)
			args.append('-r')
			args.append('9191')
			if recordingLength != 0:
				args.append('-l')
				args.append("%d" % int(recordingLength))
			if config.plugins.shoutcast.riptosinglefile.value:
				args.append('-a')
				args.append('-A')
			if not config.plugins.shoutcast.createdirforeachstream.value:
				args.append('-s')
			if config.plugins.shoutcast.addsequenceoutputfile.value:
				args.append('-q')
			cmd = [self.STREAMRIPPER_BIN, self.STREAMRIPPER_BIN] + args
			containerStreamripper.execute(*cmd)
			self["key_red"].setText(_("Stop record"))

	def deleteRecordingConfirmed(self,val):
		if val:
			containerStreamripper.sendCtrlC()

	def red_pressed(self):
		if containerStreamripper.running():
			self.session.openWithCallback(self.deleteRecordingConfirmed, MessageBox, _("Do you really want to stop the recording?"))
		else:
			if len(self.currentStreamingURL) != 0:
				self.session.openWithCallback(self.InputBoxStartRecordingCallback, InputBox, windowTitle = _("Recording length"),  title=_("Enter in minutes (0 means unlimited)"), text="0", type=Input.NUMBER)
			else:
				self.session.open(MessageBox, _("Only running streamings can be recorded!"), type = MessageBox.TYPE_INFO,timeout = 20 )

	def green_pressed(self):
		if self.mode != self.GENRELIST:
			self.stopReloadStationListTimer()
			self.mode = self.GENRELIST
			if len(self.genreList):
				self["headertext"].setText(_("SHOUTcast genre list"))
				self["list"].setMode(self.mode)
				self["list"].setList([ (x,) for x in self.genreList])
				self["list"].moveToIndex(self.genreListIndex)
			else:
				self.getGenreList()
		else:
			self.getGenreList()

	def yellow_pressed(self):
		if self.mode != self.STATIONLIST:
			if len(self.stationList):
				self.mode = self.STATIONLIST
				self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
				self["headertext"].setText(self.headerTextString)
				self["list"].setMode(self.mode)
				self["list"].setList([ (x,) for x in self.stationList])
				self["list"].moveToIndex(self.stationListIndex)
				if self.reloadStationListTimerVar != 0:
					self.reloadStationListTimer.start(60000 * self.reloadStationListTimerVar)

	def blue_pressed(self):
		if self.mode != self.FAVORITELIST:
			self.stopReloadStationListTimer()
			self.getFavoriteList(self.favoriteListIndex)

	def getFavoriteList(self, favoriteListIndex = 0):
		self["statustext"].setText("")
		self.headerTextString = _("Favorite list")
		self["headertext"].setText(self.headerTextString)
		self.mode = self.FAVORITELIST
		self["list"].setMode(self.mode)
		favoriteList = []
		for item in self.favoriteConfig.Entries:
			favoriteList.append(Favorite(configItem=item))
		self["list"].setList([ (x,) for x in favoriteList])
		if len(favoriteList):
			self["list"].moveToIndex(favoriteListIndex)
		self["list"].show()

	def getGenreList(self):
		self["headertext"].setText("")
		self["statustext"].setText(_("Getting SHOUTcast genre list..."))
		self["list"].hide()
		url = "http://yp.shoutcast.com/sbin/newxml.phtml"
		sendUrlCommand(url, None,10).addCallback(self.callbackGenreList).addErrback(self.callbackGenreListError)

	def callbackGenreList(self, xmlstring):
		self["headertext"].setText(_("SHOUTcast genre list"))
		self.genreListIndex = 0
		self.mode = self.GENRELIST
		self["list"].setMode(self.mode)
		self.genreList = self.fillGenreList(xmlstring)
		self["statustext"].setText("")
		self["list"].setList([ (x,) for x in self.genreList])
		if len(self.genreList):
			self["list"].moveToIndex(self.genreListIndex)
		self["list"].show()

	def callbackGenreListError(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(_("%s\nPress green-button to try again...") % str(error.getErrorMessage()))
			except: pass
	
		
	def fillGenreList(self,xmlstring):
		genreList = []
		try:
			root = xml.etree.cElementTree.fromstring(xmlstring)
		except: return []
		for childs in root.findall("genre"):
			genreList.append(SHOUTcastGenre(name = childs.get("name")))
		return genreList

	
	def onSelectionChanged(self):
		pass
		# till I find a better solution
#		if self.mode == self.STATIONLIST:
#			self.stationListIndex = self["list"].getCurrentIndex()
#		elif self.mode == self.FAVORITELIST:
#			self.favoriteListIndex = self["list"].getCurrentIndex()
#		elif self.mode == self.GENRELIST:
#			self.genreListIndex = self["list"].getCurrentIndex()

	def ok_pressed(self):
		if self.visible:
			sel = None
			try:
				sel = self["list"].l.getCurrentSelection()[0]
			except:return
			if sel is None:
				return
			else:
				if self.mode == self.GENRELIST:
					self.genreListIndex = self["list"].getCurrentIndex()
					self.getStationList(sel.name)
				elif self.mode == self.STATIONLIST:
					self.stationListIndex = self["list"].getCurrentIndex()
					self.stopPlaying()
					url = "http://yp.shoutcast.com%s?id=%s" % (self.tunein, sel.id)
					self["list"].hide()
					self["statustext"].setText(_("Getting streaming data from\n%s") % sel.name)
					self.currentStreamingStation = sel.name
					sendUrlCommand(url, None,10).addCallback(self.callbackPLS).addErrback(self.callbackStationListError)
				elif self.mode == self.FAVORITELIST:
					self.favoriteListIndex = self["list"].getCurrentIndex()
					if sel.configItem.type.value == "url":
						self.stopPlaying()
						self["headertext"].setText(self.headerTextString)
						self.currentStreamingStation = sel.configItem.name.value
						self.playServiceStream(sel.configItem.text.value)
					elif sel.configItem.type.value == "pls":
						self.stopPlaying()
						url = sel.configItem.text.value
						self["list"].hide()
						self["statustext"].setText(_("Getting streaming data from\n%s") % sel.configItem.name.value)
						self.currentStreamingStation = sel.configItem.name.value
						sendUrlCommand(url, None,10).addCallback(self.callbackPLS).addErrback(self.callbackStationListError)
					elif sel.configItem.type.value == "genre":
						self.getStationList(sel.configItem.name.value)
				elif self.mode == self.SEARCHLIST and self.searchSHOUTcastString != "":
					self.searchSHOUTcast(self.searchSHOUTcastString)
		else:
			self.showWindow()

	def stopPlaying(self):
		self.currentStreamingURL = ""
		self.currentStreamingStation = ""
		self["headertext"].setText("")
		self["titel"].setText("")
		self["station"].setText("")
		self.summaries.setText("")
		self["cover"].hide()
		self.session.nav.stopService()

	def callbackPLS(self, result):
		self["headertext"].setText(self.headerTextString)
		found = False
		parts = string.split(result,"\n")
		for lines in parts:
			if lines.find("File1=") != -1:
				line = string.split(lines,"File1=")
				found = True
				self.playServiceStream(line[-1].rstrip().strip())
				
		if found:
			self["statustext"].setText("")
			self["list"].show()
		else:
			self.currentStreamingStation = ""
			self["statustext"].setText(_("No streaming data found..."))

	def getStationList(self,genre):
		self.stationListHeader = _("genre %s") % genre
		self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
		self["headertext"].setText("")
		self["statustext"].setText(_("Getting %s") %  self.headerTextString)
		self["list"].hide()
		self.stationListURL = "http://yp.shoutcast.com/sbin/newxml.phtml?genre=%s" % genre
		self.stationListIndex = 0
		sendUrlCommand(self.stationListURL, None,10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def callbackStationList(self, xmlstring):
		self.searchSHOUTcastString = ""
		self.stationListXML = xmlstring
		self["headertext"].setText(self.headerTextString)
		self.mode = self.STATIONLIST
		self["list"].setMode(self.mode)
		self.stationList = self.fillStationList(xmlstring)
		self["statustext"].setText("")
		self["list"].setList([ (x,) for x in self.stationList])
		if len(self.stationList):
			self["list"].moveToIndex(self.stationListIndex)
		self["list"].show()
		if self.reloadStationListTimerVar != 0:
			self.reloadStationListTimer.start(1000 * 60)

	def fillStationList(self,xmlstring):
		stationList = []
		try:
			root = xml.etree.cElementTree.fromstring(xmlstring)
		except: return []
		config_bitrate = int(config.plugins.shoutcast.streamingrate.value)
		for childs in root.findall("tunein"):
			self.tunein = childs.get("base")
		for childs in root.findall("station"):
			try: bitrate = int(childs.get("br"))
			except: bitrate = 0
			if bitrate >= config_bitrate:
				stationList.append(SHOUTcastStation(name = childs.get("name"), 
									mt = childs.get("mt"), id = childs.get("id"), br = childs.get("br"), 
									genre = childs.get("genre"), ct = childs.get("ct"), lc = childs.get("lc")))
		return stationList

	def menu_pressed(self):
		if not self.visible:
			self.showWindow()
		options = [(_("Config"), self.config),(_("Search"), self.search),]
		if self.mode == self.FAVORITELIST and self.getSelectedItem() is not None:
			options.extend(((_("rename current selected favorite"), self.renameFavorite),))
			options.extend(((_("remove current selected favorite"), self.removeFavorite),))
		elif self.mode == self.GENRELIST and self.getSelectedItem() is not None:
			options.extend(((_("Add current selected genre to favorite"), self.addGenreToFavorite),))
		elif self.mode == self.STATIONLIST and self.getSelectedItem() is not None:
			options.extend(((_("Add current selected station to favorite"), self.addStationToFavorite),))
		if len(self.currentStreamingURL) != 0:
			options.extend(((_("Add current playing stream to favorite"), self.addCurrentStreamToFavorite),))
		options.extend(((_("Hide"), self.hideWindow),))
		self.session.openWithCallback(self.menuCallback, ChoiceBox,list = options)

	def menuCallback(self, ret):
		ret and ret[1]()

	def hideWindow(self):
		self.visible = False
		self.hide()

	def showWindow(self):
		self.visible = True
		self.show()

	def addGenreToFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.addFavorite(name = sel.name, text = sel.name, favoritetype = "genre")			

	def addStationToFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.addFavorite(name = sel.name, text = "http://yp.shoutcast.com%s?id=%s" % (self.tunein, sel.id), favoritetype = "pls", audio = sel.mt, bitrate = sel.br)			

	def addCurrentStreamToFavorite(self):
		self.addFavorite(name = self.currentStreamingStation, text = self.currentStreamingURL, favoritetype = "url")

	def addFavorite(self, name = "", text = "", favoritetype = "", audio = "", bitrate = ""):
		self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value + 1
		self.favoriteConfig.entriescount.save()
		newFavorite = self.initFavouriteEntryConfig()
		newFavorite.name.value = name
		newFavorite.text.value = text
		newFavorite.type.value = favoritetype
		newFavorite.audio.value = audio
		newFavorite.bitrate.value = bitrate
		newFavorite.save()
		self.favoriteConfig.saveToFile(self.FAVORITE_FILE)

	def renameFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.session.openWithCallback(self.renameFavoriteFinished, VirtualKeyBoard, title = _("Enter new name for favorite item"), text = sel.configItem.name.value)

	def renameFavoriteFinished(self, text = None):
		if text:
			sel = self.getSelectedItem()
			sel.configItem.name.value = text
			sel.configItem.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)
			self.favoriteListIndex = 0
			self.getFavoriteList()


	def removeFavorite(self):
		sel = self.getSelectedItem()
		if sel is not None:
			self.favoriteConfig.entriescount.value = self.favoriteConfig.entriescount.value - 1
			self.favoriteConfig.entriescount.save()
			self.favoriteConfig.Entries.remove(sel.configItem)
			self.favoriteConfig.Entries.save()
			self.favoriteConfig.saveToFile(self.FAVORITE_FILE)
			self.favoriteListIndex = 0
			self.getFavoriteList()

	def search(self):
		self.session.openWithCallback(self.searchSHOUTcast, VirtualKeyBoard, title = _("Enter text to search for"))

	def searchSHOUTcast(self, searchstring = None):
		if searchstring:
			self.stopReloadStationListTimer()
			self.stationListHeader = _("search-criteria %s") % searchstring
			self.headerTextString = _("SHOUTcast station list for %s") % self.stationListHeader
			self["headertext"].setText("")
			self["statustext"].setText(_("Searching SHOUTcast for %s...") % searchstring)
			self["list"].hide()
			self.stationListURL = "http://yp.shoutcast.com/sbin/newxml.phtml?search=%s" % searchstring
			self.mode = self.SEARCHLIST
			self.searchSHOUTcastString = searchstring
			self.stationListIndex = 0
			sendUrlCommand(self.stationListURL, None,10).addCallback(self.callbackStationList).addErrback(self.callbackStationListError)

	def config(self):
		self.stopReloadStationListTimer()
		self.session.openWithCallback(self.setupFinished, SHOUTcastSetup)

	def setupFinished(self, result):
		if result:
			if self.mode == self.STATIONLIST:
				self.reloadStationListTimerVar = int(config.plugins.shoutcast.reloadstationlist.value)
				self.stationListIndex = 0
				self.callbackStationList(self.stationListXML)

	def callbackStationListError(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(_("%s\nPress OK to try again...") % str(error.getErrorMessage()))
			except: pass

	def Error(self, error = None):
		if error is not None:
			try:
				self["list"].hide()
				self["statustext"].setText(str(error.getErrorMessage()))
			except: pass
	
	def __onClose(self):
		self.stopReloadStationListTimer()
		self.session.nav.playService(self.CurrentService)
		containerStreamripper.dataAvail.remove(self.streamripperDataAvail)
		containerStreamripper.appClosed.remove(self.streamripperClosed)

	def GoogleImageCallback(self, result):
		foundPos = result.find("imgres?imgurl=")
		foundPos2 = result.find("&imgrefurl=")
		if foundPos != -1 and foundPos2 != -1:
			print "[SHOUTcast] downloading cover from %s " % result[foundPos+14:foundPos2]
			downloadPage(result[foundPos+14:foundPos2] ,"/tmp/.cover").addCallback(self.coverDownloadFinished).addErrback(self.coverDownloadFailed)

	def coverDownloadFailed(self,result):
        	print "[SHOUTcast] cover download failed: %s " % result
		self["cover"].hide()

	def coverDownloadFinished(self,result):
		print "[SHOUTcast] cover download finished"
		self["cover"].updateIcon("/tmp/.cover")
		self["cover"].show()
		
	def __evUpdatedInfo(self):
		sTitle = ""
		currPlay = self.session.nav.getCurrentService()
		if currPlay is not None:
			sTitle = currPlay.info().getInfoString(iServiceInformation.sTagTitle)
			if (len(sTitle) !=0):
				url = "http://images.google.de/images?q=%s&btnG=Bilder-Suche" % quote(sTitle)
				sendUrlCommand(url, None,10).addCallback(self.GoogleImageCallback).addErrback(self.Error)
		if len(sTitle) == 0:
			sTitle = "n/a"
		title = _("Title: %s") % sTitle
		self["titel"].setText(title)
		self.summaries.setText(title)


	def __evAudioDecodeError(self):
		currPlay = self.session.nav.getCurrentService()
		sAudioType = currPlay.info().getInfoString(iServiceInformation.sUser+10)
		print "[SHOUTcast __evAudioDecodeError] audio-codec %s can't be decoded by hardware" % (sAudioType)
		self.session.open(MessageBox, _("This Dreambox can't decode %s streams!") % sAudioType, type = MessageBox.TYPE_INFO,timeout = 20 )

	def __evPluginError(self):
		currPlay = self.session.nav.getCurrentService()
		message = currPlay.info().getInfoString(iServiceInformation.sUser+12)
		print "[SHOUTcast __evPluginError]" , message
		self.session.open(MessageBox, message, type = MessageBox.TYPE_INFO,timeout = 20 )

	def doEofInternal(self, playing):
		self.stopPlaying()

	def checkSkipShowHideLock(self):
		# nothing to do here
		pass
	
	def playServiceStream(self, url):
		self.session.nav.stopService()
		sref = eServiceReference(4097, 0, url)
		self.session.nav.playService(sref)
		self.currentStreamingURL = url
		self["titel"].setText(_("Title: n/a"))
		self["station"].setText(_("Station: %s") % self.currentStreamingStation)

	def createSummary(self):
		return SHOUTcastLCDScreen

	def initFavouriteEntryConfig(self):
		self.favoriteConfig.Entries.append(ConfigSubsection())
		i = len(self.favoriteConfig.Entries) -1
		self.favoriteConfig.Entries[i].name = ConfigText(default = "")
		self.favoriteConfig.Entries[i].text = ConfigText(default = "")
		self.favoriteConfig.Entries[i].type = ConfigText(default = "")
		self.favoriteConfig.Entries[i].audio = ConfigText(default = "")
		self.favoriteConfig.Entries[i].bitrate = ConfigText(default = "")
		return self.favoriteConfig.Entries[i]

	def initFavouriteConfig(self):
		count = self.favoriteConfig.entriescount.value
		if count != 0:
			i = 0
			while i < count:
				self.initFavouriteEntryConfig()
				i += 1

	def getSelectedItem(self):
		sel = None
		try:
			sel = self["list"].l.getCurrentSelection()[0]
		except:return None
		return sel