X-Git-Url: https://git.rvb.name/vpproxy.git/blobdiff_plain/c2d718aaa1c9aed7893892bf0b98e5f1b6e4336f..3893699c9a2984576b62b6c3f1eb77f34a4cf0ab:/plugins/torrenttv_api.py diff --git a/plugins/torrenttv_api.py b/plugins/torrenttv_api.py new file mode 100644 index 0000000..ce5a86d --- /dev/null +++ b/plugins/torrenttv_api.py @@ -0,0 +1,173 @@ +# coding=utf-8 +""" +Torrent-TV API communication class +Forms requests to API, checks result for errors and returns in desired form (lists or raw data) +""" +__author__ = 'miltador' + +import urllib2 +import socket +import xml.dom.minidom as dom + + +class TorrentTvApiException(Exception): + """ + Exception from Torrent-TV API + """ + pass + + +class TorrentTvApi(object): + CATEGORIES = { + 1: 'Детские', + 2: 'Музыка', + 3: 'Фильмы', + 4: 'Спорт', + 5: 'Общие', + 6: 'Познавательные', + 7: 'Новостные', + 8: 'Развлекательные', + 9: 'Для взрослых', + 10: 'Мужские', + 11: 'Региональные', + 12: 'Религиозные' + } + + @staticmethod + def auth(email, password, raw=False): + """ + User authentication + Returns user session that can be used for API requests + + :param email: user email string + :param password: user password string + :param raw: if True returns unprocessed data + :return: unique session string + """ + + xmlresult = TorrentTvApi._result( + 'v2_auth.php?username=' + email + '&password=' + password + '&application=tsproxy') + if raw: + return xmlresult + res = TorrentTvApi._check(xmlresult) + session = res.getElementsByTagName('session')[0].firstChild.data + return session + + @staticmethod + def translations(session, translation_type, raw=False): + """ + Gets list of translations + Translations are basically TV channels + + :param session: valid user session required + :param translation_type: playlist type, valid values: all|channel|moderation|translation|favourite + :param raw: if True returns unprocessed data + :return: translations list + """ + xmlresult = TorrentTvApi._result( + 'v2_alltranslation.php?session=' + session + '&type=' + translation_type) + if raw: + return xmlresult + res = TorrentTvApi._check(xmlresult) + translationslist = res.getElementsByTagName('channel') + return translationslist + + @staticmethod + def records(session, channel_id, date, raw=False): + """ + Gets list of available record for given channel and date + + :param session: valid user session required + :param channel_id: id of channel in channel list + :param date: format %d-%m-%Y + :param raw: if True returns unprocessed data + :return: records list + """ + xmlresult = TorrentTvApi._result( + 'v2_arc_getrecords.php?session=' + session + '&channel_id=' + channel_id + '&date=' + date) + if raw: + return xmlresult + res = TorrentTvApi._check(xmlresult) + recordslist = res.getElementsByTagName('channel') + return recordslist + + @staticmethod + def archive_channels(session, raw=False): + """ + Gets the channels list for archive + + :param session: valid user session required + :param raw: if True returns unprocessed data + :return: archive channels list + """ + xmlresult = TorrentTvApi._result( + 'v2_arc_getchannels.php?session=' + session) + if raw: + return xmlresult + res = TorrentTvApi._check(xmlresult) + archive_channelslist = res.getElementsByTagName('channel') + return archive_channelslist + + @staticmethod + def stream_source(session, channel_id): + """ + Gets the source for Ace Stream by channel id + + :param session: valid user session required + :param channel_id: id of channel in translations list (see translations() method) + :return: type of stream and source + """ + xmlresult = TorrentTvApi._result( + 'v2_get_stream.php?session=' + session + '&channel_id=' + channel_id) + res = TorrentTvApi._check(xmlresult) + stream_type = res.getElementsByTagName('type')[0].firstChild.data + source = res.getElementsByTagName('source')[0].firstChild.data + return stream_type.encode('utf-8'), source.encode('utf-8') + + @staticmethod + def archive_stream_source(session, record_id): + """ + Gets stream source for archive record + + :param session: valid user session required + :param record_id: id of record in records list (see records() method) + :return: type of stream and source + """ + xmlresult = TorrentTvApi._result( + 'v2_arc_getstream.php?session=' + session + '&record_id=' + record_id) + res = TorrentTvApi._check(xmlresult) + stream_type = res.getElementsByTagName('type')[0].firstChild.data + source = res.getElementsByTagName('source')[0].firstChild.data + return stream_type.encode('utf-8'), source.encode('utf-8') + + @staticmethod + def _check(xmlresult): + """ + Validates received API answer + Raises an exception if error detected + + :param xmlresult: API answer to check + :return: minidom-parsed xmlresult + :raise: TorrentTvApiException + """ + res = dom.parseString(xmlresult).documentElement + success = res.getElementsByTagName('success')[0].firstChild.data + if success == '0' or not success: + error = res.getElementsByTagName('error')[0].firstChild.data + raise TorrentTvApiException('API returned error: ' + error) + return res + + @staticmethod + def _result(request): + """ + Sends request to API and returns the result in form of string + + :param request: API command string + :return: result of request to API + :raise: TorrentTvApiException + """ + try: + result = urllib2.urlopen('http://api.torrent-tv.ru/' + request + '&typeresult=xml', timeout=10).read() + return result + except (urllib2.URLError, socket.timeout) as e: + raise TorrentTvApiException('Error happened while trying to access API: ' + repr(e)) \ No newline at end of file