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, date=None):
34 tree = self._get_page_with_validation(
35 action="lds.radio.radiochannels.programming.query",
40 tree = self._get_page_with_validation(
41 action="lds.radio.radiochannels.programming.query",
44 programs = tree.find("programs")
45 return self._process_list(programs, ["date", "time", "title", "shortdescription", "artist"])
47 def get_conferences(self, langId):
48 tree = self._get_page_with_validation(
49 action="lds.radio.conferences.query",
52 conferences = tree.find("conferences")
53 return self._process_list(conferences, ["title", "full_title", "month", "year"])
55 def get_conference_sessions(self, confId):
56 tree = self._get_page_with_validation(
57 action="lds.radio.conferences.sessions.query",
60 items = tree.find("sessions")
61 return self._process_list(items, ["title", "short_title", "order"])
63 def get_conference_talks(self, sessionId):
64 tree = self._get_page_with_validation(
65 action="lds.radio.conferences.sessions.talks.query",
68 items = tree.find("talks")
69 return self._process_list(items, ["title", "order", "url", "speaker"])
71 def get_magazines(self, langId):
72 tree = self._get_page_with_validation(
73 action="lds.radio.magazines.query",
76 magazines = tree.find("magazines")
77 return self._process_list(magazines, ["title"])
79 def get_magazine_issues(self, magId):
80 tree = self._get_page_with_validation(
81 action="lds.radio.magazines.issues.query",
84 items = tree.find("issues")
85 return self._process_list(items, ["title", "year", "month", "pictureURL"])
87 def get_magazine_articles(self, issueId):
88 tree = self._get_page_with_validation(
89 action="lds.radio.magazines.issues.articles.query",
92 items = tree.find("articles")
93 return self._process_list(items, ["title", "author", "url"])
95 def get_scriptures(self, langId):
96 tree = self._get_page_with_validation(
97 action="lds.radio.scriptures.query",
100 scriptures = tree.find("scriptures")
101 return self._process_list(scriptures, ["title"])
103 def get_scripture_books(self, scriptId):
104 tree = self._get_page_with_validation(
105 action="lds.radio.scriptures.books.query",
106 scriptureID=scriptId,
108 items = tree.find("books")
109 return self._process_list(items, ["title"])
111 def get_scripture_chapters(self, bookId):
112 tree = self._get_page_with_validation(
113 action="lds.radio.scriptures.books.chapters.query",
116 items = tree.find("chapters")
117 return self._process_list(items, ["title", "url"])
119 def _get_page_with_validation(self, **params):
120 encodedParams = urllib.urlencode(params)
121 page = self._browser.download("http://tech.lds.org/radio?%s" % encodedParams)
123 raise RuntimeError("Blank page")
124 tree = ElementTree.fromstring(page)
126 if tree.tag == "apiresults":
127 desc = tree.find("ErrorDescription")
128 raise RuntimeError(desc.text)
130 results = tree.find("apiresults")
131 if not results.attrib["success"]:
132 raise RuntimeError("Could not determine radio languages")
136 def _process_list(self, tree, elements):
137 for item in tree.getchildren():
138 data = {"id": item.attrib["ID"]}
139 for element in elements:
140 data[element] = item.find(element).text
144 if __name__ == "__main__":
147 print list(b.get_languages())
150 channels = list(b.get_radio_channels())
152 for chanData in channels:
153 programs = list(b.get_radio_channel_programming(chanData["id"]))
157 confs = list(b.get_conferences(1))
159 for confData in confs:
160 sessions = list(b.get_conference_sessions(confData["id"]))
161 for sessionData in sessions:
163 talks = list(b.get_conference_talks(sessionData["id"]))
167 mags = list(b.get_magazines(1))
170 issues = list(b.get_magazine_issues(magData["id"]))
171 for issueData in issues:
173 articles = list(b.get_magazine_articles(issueData["id"]))
177 mags = list(b.get_scriptures(1))
180 books = list(b.get_scripture_books(magData["id"]))
181 for bookData in books:
183 chapters = list(b.get_scripture_chapters(bookData["id"]))