4 from xml.etree import ElementTree
10 _moduleLogger = logging.getLogger(__name__)
13 class Backend(object):
16 self._browser = browser_emu.MozillaEmulator()
18 def get_languages(self):
19 tree = self._get_page_with_validation(
20 action="lds.radio.languages.query",
22 languages = tree.find("languages")
23 return self._process_list(languages, ["name"])
25 def get_radio_channels(self):
26 tree = self._get_page_with_validation(
27 action="lds.radio.radiochannels.query",
29 channels = tree.find("channels")
30 return self._process_list(channels, ["description", "url", "port"])
32 def get_radio_channel_programming(self, chanId):
33 tree = self._get_page_with_validation(
34 action="lds.radio.radiochannels.programming.query",
37 programs = tree.find("programs")
38 return self._process_list(programs, ["date", "time", "title", "shortdescription", "artist"])
40 def get_conferences(self, langId):
41 tree = self._get_page_with_validation(
42 action="lds.radio.conferences.query",
45 conferences = tree.find("conferences")
46 return self._process_list(conferences, ["title", "full_title", "month", "year"])
48 def get_conference_sessions(self, confId):
49 tree = self._get_page_with_validation(
50 action="lds.radio.conferences.sessions.query",
53 items = tree.find("sessions")
54 return self._process_list(items, ["title", "short_title", "order"])
56 def get_conference_talks(self, sessionId):
57 tree = self._get_page_with_validation(
58 action="lds.radio.conferences.sessions.talks.query",
61 items = tree.find("talks")
62 return self._process_list(items, ["title", "order", "url", "speaker"])
64 def get_magazines(self, langId):
65 tree = self._get_page_with_validation(
66 action="lds.radio.magazines.query",
69 magazines = tree.find("magazines")
70 return self._process_list(magazines, ["title"])
72 def get_magazine_issues(self, magId):
73 tree = self._get_page_with_validation(
74 action="lds.radio.magazines.issues.query",
77 items = tree.find("issues")
78 return self._process_list(items, ["title", "year", "month", "pictureURL"])
80 def get_magazine_articles(self, issueId):
81 tree = self._get_page_with_validation(
82 action="lds.radio.magazines.issues.articles.query",
85 items = tree.find("articles")
86 return self._process_list(items, ["title", "author", "url"])
88 def get_scriptures(self, langId):
89 tree = self._get_page_with_validation(
90 action="lds.radio.scriptures.query",
93 scriptures = tree.find("scriptures")
94 return self._process_list(scriptures, ["title"])
96 def get_scripture_books(self, scriptId):
97 tree = self._get_page_with_validation(
98 action="lds.radio.scriptures.books.query",
101 items = tree.find("books")
102 return self._process_list(items, ["title"])
104 def get_scripture_chapters(self, bookId):
105 tree = self._get_page_with_validation(
106 action="lds.radio.scriptures.books.chapters.query",
109 items = tree.find("chapters")
110 return self._process_list(items, ["title", "url"])
112 def _get_page_with_validation(self, **params):
113 encodedParams = urllib.urlencode(params)
114 page = self._browser.download("http://tech.lds.org/radio?%s" % encodedParams)
116 raise RuntimeError("Blank page")
117 tree = ElementTree.fromstring(page)
119 if tree.tag == "apiresults":
120 desc = tree.find("ErrorDescription")
121 raise RuntimeError(desc.text)
123 results = tree.find("apiresults")
124 if not results.attrib["success"]:
125 raise RuntimeError("Could not determine radio languages")
129 def _process_list(self, tree, elements):
130 for item in tree.getchildren():
131 data = {"id": item.attrib["ID"]}
132 for element in elements:
133 data[element] = item.find(element).text
137 if __name__ == "__main__":
140 print list(b.get_languages())
143 channels = list(b.get_radio_channels())
145 for chanData in channels:
146 programs = list(b.get_radio_channel_programming(chanData["id"]))
150 confs = list(b.get_conferences(1))
152 for confData in confs:
153 sessions = list(b.get_conference_sessions(confData["id"]))
154 for sessionData in sessions:
155 talks = list(b.get_conference_talks(sessionData["id"]))
159 mags = list(b.get_magazines(1))
162 issues = list(b.get_magazine_issues(magData["id"]))
164 for issueData in issues:
165 articles = list(b.get_magazine_articles(issueData["id"]))
169 mags = list(b.get_scriptures(1))
172 books = list(b.get_scripture_books(magData["id"]))
174 for bookData in books:
175 chapters = list(b.get_scripture_chapters(bookData["id"]))