This file is indexed.

/usr/lib/rhythmbox/plugins/radio-browser/shoutcast_handler.py is in rhythmbox-radio-browser 2.3.1-0ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#    This file is part of Radio-Browser-Plugin for Rhythmbox.
#
#    Copyright (C) 2009 <segler_alex@web.de>
#
#    Radio-Browser-Plugin is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    Radio-Browser-Plugin is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with Radio-Browser-Plugin.  If not, see <http://www.gnu.org/licenses/>.

import os
import urllib
import urllib2
import xml.sax.handler

from radio_station import RadioStation
from feed import Feed

class ShoutcastRadioStation(RadioStation):
	def updateRealURL(self):
		self.listen_urls = []
		try:
			# download from "http://www.shoutcast.com"+self.tunein+"?id="+shoutcast_id
			url = "http://www.shoutcast.com"+self.tunein+"?id="+self.listen_id
			remote = urllib2.urlopen(url)
			data = remote.read()
			remote.close()

			lines = data.splitlines()
			for line in lines:
				if line.startswith("File"):
					self.listen_urls.append(line.split("=")[1])
					print "new link:"+line.split("=")[1]
			self.askUserAboutUrls()
		except:
			return
	def getRealURL(self):
		if self.listen_url == "":
			self.updateRealURL()
		if self.listen_url == "":
			return None
		else:
			return self.listen_url

class ShoutcastHandler(xml.sax.handler.ContentHandler):
	def __init__(self):
		self.genres = []
		self.entries = []
 
	def startElement(self, name, attributes):
		if name == "genre":
			self.genres.append(attributes.get("name"))
		if name == "tunein":
			self.tunein = attributes.get("base")
		if name == "station":
			self.entry = ShoutcastRadioStation()
			self.entry.tunein = self.tunein
			self.entry.type = "Shoutcast"
			self.entry.server_name = attributes.get("name")
			self.entry.genre = attributes.get("genre").lower()
			self.entry.genre = ",".join(self.entry.genre.split(" "))
			self.entry.current_song = attributes.get("ct")
			self.entry.bitrate = attributes.get("br")
			self.entry.listen_id = attributes.get("id")
			self.entry.listeners = attributes.get("lc")
			self.entry.server_type = attributes.get("mt")
			try:
				self.entry.homepage = "http://shoutcast.com/directory/search_results.jsp?searchCrit=simple&s="+urllib.quote_plus(self.entry.server_name.replace("- [SHOUTcast.com]","").strip())
			except:
				self.entry.homepage = ""
			self.entries.append(self.entry)

class FeedShoutcast(Feed):
	def __init__(self,cache_dir,status_change_handler):
		Feed.__init__(self)
		print "init shoutcast feed"
		self.handler = ShoutcastHandler()
		self.cache_dir = cache_dir
		self.filename = os.path.join(self.cache_dir, "shoutcast-genre.xml")
		self.uri = "http://www.shoutcast.com/sbin/newxml.phtml"
		self.status_change_handler = status_change_handler

	def name(self):
		return "Shoutcast"

	def getHomepage(self):
		return "http://shoutcast.com/"

	def genres(self):
		if not self.loaded:
			if not os.path.isfile(self.filename):
				self.download()
			self.load()
			self.loaded = True

		return self.handler.genres

	def entries(self):
		entry_list = []
		genres = self.genres()
		for genre in genres:
			entry = FeedSubShoutcast(self.cache_dir,self.status_change_handler,genre)
			entry_list.append(entry)

		return entry_list

	def search(self,term):
		searchUrl = "http://www.shoutcast.com/sbin/newxml.phtml?%s" % urllib.urlencode({"search":term})
		data = self.downloadFile(searchUrl)
		handler = ShoutcastHandler()
		if data != None:
			xml.sax.parseString(data,handler)
			return handler.entries

		return None

class FeedSubShoutcast(Feed):
	def __init__(self,cache_dir,status_change_handler,genre):
		Feed.__init__(self)
		self.handler = ShoutcastHandler()
		self.cache_dir = cache_dir
		self.filename = os.path.join(self.cache_dir, "shoutcast-"+genre+".xml")
		self.uri = "http://www.shoutcast.com/sbin/newxml.phtml?%s" % urllib.urlencode({"genre":genre})
		self.status_change_handler = status_change_handler
		self.genre = genre
		self.setAutoDownload(False)
		self.setUpdateChecking(False)

	def name(self):
		return "Shoutcast Genre "+self.genre

	def getHomepage(self):
		return "http://shoutcast.com/"