# -*- Mode: Python; -*- # -*- coding: utf-8 -*- # vi:si:et:sw=2:sts=2:ts=2 from datetime import datetime import re import socket from urllib import quote import sha from oxutils.cache import getUrl, getUrlUnicode from oxutils import findRegexp, cache, stripTags, decodeHtml, getTorrentInfo, intValue, normalizeNewlines from oxutils.normalize import normalizeImdbId from torrent import Torrent socket.setdefaulttimeout(10.0) def _parseResultsPage(data, max_results=10): results=[] regexp = '''(.*?)(.*?)(.*?).*?.*?''' for row in re.compile(regexp, re.DOTALL).findall(data): torrentDate = row[0] torrentExtra = row[1] torrentId = row[2] torrentTitle = decodeHtml(row[3]).strip() torrentLink = "http://www.mininova.org/tor/" + torrentId privateTracker = 'priv.gif' in torrentExtra if not privateTracker: results.append((torrentTitle, torrentLink, '')) return results def findMovie(query, max_results=10): '''search for torrents on mininova ''' url = "http://www.mininova.org/search/%s/seeds" % quote(query) data = getUrlUnicode(url) return _parseResultsPage(data, max_results) def findMovieByImdb(imdbId): '''find torrents on mininova for a given imdb id ''' results = [] imdbId = normalizeImdbId(imdbId) data = getUrlUnicode("http://www.mininova.org/imdb/?imdb=%s" % imdbId) return _parseResultsPage(data) def getId(mininovaId): mininovaId = unicode(mininovaId) d = findRegexp(mininovaId, "/(\d+)") if d: return d mininovaId = mininovaId.split('/') if len(mininovaId) == 1: return mininovaId[0] else: return mininovaId[-1] def getData(mininovaId): _key_map = { 'by': u'uploader', } mininovaId = getId(mininovaId) torrent = dict() torrent[u'id'] = mininovaId torrent[u'domain'] = 'mininova.org' torrent[u'comment_link'] = "http://www.mininova.org/tor/%s" % mininovaId torrent[u'torrent_link'] = "http://www.mininova.org/get/%s" % mininovaId torrent[u'details_link'] = "http://www.mininova.org/det/%s" % mininovaId data = getUrlUnicode(torrent['comment_link']) + getUrlUnicode(torrent['details_link']) if '

Torrent not found...

' in data: return None for d in re.compile('

.(.*?):(.*?)

', re.DOTALL).findall(data): key = d[0].lower().strip() key = _key_map.get(key, key) value = decodeHtml(stripTags(d[1].strip())) torrent[key] = value torrent[u'title'] = findRegexp(data, '(.*?):.*?') torrent[u'imdbId'] = findRegexp(data, 'title/tt(\d{7})') torrent[u'description'] = findRegexp(data, '
(.*?)
') if torrent['description']: torrent['description'] = normalizeNewlines(decodeHtml(stripTags(torrent['description']))).strip() t = getUrl(torrent[u'torrent_link']) torrent[u'torrent_info'] = getTorrentInfo(t) return torrent class Mininova(Torrent): ''' >>> Mininova('123') {} >>> sha.sha(unicode(Mininova('1072195'))).hexdigest() 'ec98268a0aeaef8292f7bcf3585d0bc3910b3fac' ''' def __init__(self, mininovaId): self.data = getData(mininovaId) if not self.data: return Torrent.__init__(self) ratio = self.data['share ratio'].split(',') self['seeder'] = int(intValue(ratio[0].replace(',','').strip())) self['leecher'] = int(intValue(ratio[1].replace(',','').strip())) self['downloaded'] = int(intValue(self.data['downloads'].replace(',','').strip())) published = self.data['added on'] published = published.split(' +')[0] self['published'] = datetime.strptime(published, "%a, %d %b %Y %H:%M:%S")