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 date = date.strftime("%Y-%m-%d")
35 tree = self._get_page_with_validation(
36 action="lds.radio.radiochannels.programming.query",
41 tree = self._get_page_with_validation(
42 action="lds.radio.radiochannels.programming.query",
45 programs = tree.find("programs")
46 return self._process_list(programs, ["date", "time", "title", "shortdescription", "artist"])
48 def get_conferences(self, langId):
49 tree = self._get_page_with_validation(
50 action="lds.radio.conferences.query",
53 conferences = tree.find("conferences")
54 return self._process_list(conferences, ["title", "full_title", "month", "year"])
56 def get_conference_sessions(self, confId):
57 tree = self._get_page_with_validation(
58 action="lds.radio.conferences.sessions.query",
61 items = tree.find("sessions")
62 return self._process_list(items, ["title", "short_title", "order"])
64 def get_conference_talks(self, sessionId):
65 tree = self._get_page_with_validation(
66 action="lds.radio.conferences.sessions.talks.query",
69 items = tree.find("talks")
70 return self._process_list(items, ["title", "order", "url", "speaker"])
72 def get_magazines(self, langId):
73 tree = self._get_page_with_validation(
74 action="lds.radio.magazines.query",
77 magazines = tree.find("magazines")
78 return self._process_list(magazines, ["title"])
80 def get_magazine_issues(self, magId):
81 tree = self._get_page_with_validation(
82 action="lds.radio.magazines.issues.query",
85 items = tree.find("issues")
86 return self._process_list(items, ["title", "year", "month", "pictureURL"])
88 def get_magazine_articles(self, issueId):
89 tree = self._get_page_with_validation(
90 action="lds.radio.magazines.issues.articles.query",
93 items = tree.find("articles")
94 return self._process_list(items, ["title", "author", "url"])
96 def get_scriptures(self, langId):
97 tree = self._get_page_with_validation(
98 action="lds.radio.scriptures.query",
101 scriptures = tree.find("scriptures")
102 return self._process_list(scriptures, ["title"])
104 def get_scripture_books(self, scriptId):
105 tree = self._get_page_with_validation(
106 action="lds.radio.scriptures.books.query",
107 scriptureID=scriptId,
109 items = tree.find("books")
110 return self._process_list(items, ["title"])
112 def get_scripture_chapters(self, bookId):
113 tree = self._get_page_with_validation(
114 action="lds.radio.scriptures.books.chapters.query",
117 items = tree.find("chapters")
118 return self._process_list(items, ["title", "url"])
120 def _get_page_with_validation(self, **params):
121 encodedParams = urllib.urlencode(params)
122 page = self._browser.download("http://tech.lds.org/radio?%s" % encodedParams)
124 raise RuntimeError("Blank page")
125 tree = ElementTree.fromstring(page)
127 if tree.tag == "apiresults":
128 desc = tree.find("ErrorDescription")
129 raise RuntimeError(desc.text)
131 results = tree.find("apiresults")
132 if not results.attrib["success"]:
133 raise RuntimeError("Could not determine radio languages")
137 def _process_list(self, tree, elements):
138 for item in tree.getchildren():
139 data = {"id": item.attrib["ID"]}
140 for element in elements:
141 data[element] = item.find(element).text
145 if __name__ == "__main__":
148 print list(b.get_languages())
151 channels = list(b.get_radio_channels())
153 for chanData in channels:
154 programs = list(b.get_radio_channel_programming(chanData["id"]))
158 confs = list(b.get_conferences(1))
160 for confData in confs:
161 sessions = list(b.get_conference_sessions(confData["id"]))
162 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"]))
172 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"]))
182 for bookData in books:
183 chapters = list(b.get_scripture_chapters(bookData["id"]))