def _GetLastTorrentData(self): while True: time.sleep(0.2) # Get torrent files list, filtered by video file type only files = self.engine.list() #(media_types=[MediaType.VIDEO]) # If torrent metadata is not loaded yet then continue if files is None: self.debug('files is None') continue self.debug('files len: ' + str(len(files))) # Torrent has no video files if not files or len(files) > 0: break info_hash = '' playable_items = [] for item in files: if TorrentPlayer.is_playable(item.name): playable_items.append({ 'index': item.index, 'name': item.name, 'size': long(item.size) }) return {'info_hash': info_hash, 'files': playable_items}
def parse_torrent2(data): try: decoded = bdecode(data) except BTFailure: debug("Can't decode torrent data (invalid torrent link? %s)" % link) return files = [] info = decoded['info'] if 'files' in info: for i, f in enumerate(info['files']): # debug(i) # debug(f) fname = f['path'][-1] if TorrentPlayer.is_playable(fname): s = re.search('s(\d+)e(\d+)[\._ ]', fname, re.I) if s: season = int(s.group(1)) episode = int(s.group(2)) debug( 'Filename: %s\t index: %d\t season: %d\t episode: %d' % (fname, i, season, episode)) files.append({ 'index': i, 'name': fname, 'season': season, 'episode': episode }) if len(files) == 0: return files.sort(key=lambda x: (x['season'], x['episode'])) return files
def GetLastTorrentData(self): ''' return { 'info_hash': str, 'files': [ {'index': int, 'name': str, 'size': long} ] } ''' ''' As soon as check_torrent_added returns true, get added torrent data using get_last_added_torrent method. This method will return a JSON object containing a torrent`s info-hash as a string (technically, this is an info-hash hexdigest) and the list of files in the torrent along with their sizes. The info-hash is used as a primary torrent ID for other JSON-RPC methods. ''' files = [] r = requests.post('http://localhost:8668/json-rpc', json={"method": "get_last_added_torrent"}) torr_data = r.json()['result'] debug(torr_data) self.__info_hash = torr_data['info_hash'] index = 0 for file in torr_data['files']: if TorrentPlayer.is_playable(file[0]): files.append({'index': index, 'name': file[0], 'size': long(file[1])}) index = index + 1 return { 'info_hash': self.__info_hash, 'files': files }
def parse_torrent2(data): try: decoded = bdecode(data) except BTFailure: debug("Can't decode torrent data (invalid torrent link? %s)" % link) return files = [] info = decoded['info'] if 'files' in info: for i, f in enumerate(info['files']): # debug(i) # debug(f) fname = f['path'][-1] if TorrentPlayer.is_playable(fname): s = re.search('s(\d+)e(\d+)[\._ ]', fname, re.I) if s: season = int(s.group(1)) episode = int(s.group(2)) debug('Filename: %s\t index: %d\t season: %d\t episode: %d' % (fname, i, season, episode)) files.append({'index': i, 'name': fname, 'season': season, 'episode': episode}) if len(files) == 0: return files.sort(key=lambda x: (x['season'], x['episode'])) return files
def parse_torrent(data, season=None): from bencode import BTFailure try: from bencode import bdecode decoded = bdecode(data) except BTFailure: debug("Can't decode torrent data (invalid torrent link?)") return [] info = decoded['info'] dirlists = dict() #filelists = dict() if 'files' in info: for i, f in enumerate(info['files']): # debug(i) # debug(f) fname = f['path'][-1] try: parent = f['path'][-2] except: parent = '.' if parent not in dirlists: dirlists[parent] = dict() #filelists[parent] = dict() debug(fname) if TorrentPlayer.is_playable(fname): dirlists[parent][fname] = i # .decode('utf-8').encode('cp1251') #filelists[parent].append({fname: i}) files = [] for dirname in dirlists: dirlist = dirlists[dirname] save_season = season for item in get_list(dirlist): if item is not None: if season is None: if item[0] is None: season = seasonfromname(info['name']) if season is None: try: season = seasonfromname(dirname) except: pass else: season = item[0] name = item[2] index = item[3] files.append({'name': name, 'season': season, 'episode': item[1], 'index': index}) season = save_season else: # TODO continue files.sort(key=lambda x: (x['season'], x['episode'])) return files
def parse_torrent(data, season=None): from bencode import BTFailure try: from bencode import bdecode decoded = bdecode(data) except BTFailure: debug("Can't decode torrent data (invalid torrent link?)") return [] info = decoded['info'] dirlists = dict() #filelists = dict() if 'files' in info: for i, f in enumerate(info['files']): # debug(i) # debug(f) fname = f['path'][-1] try: parent = f['path'][-2] except: parent = '.' if parent not in dirlists: dirlists[parent] = dict() #filelists[parent] = dict() debug(fname) if TorrentPlayer.is_playable(fname): dirlists[parent][ fname] = i # .decode('utf-8').encode('cp1251') #filelists[parent].append({fname: i}) files = [] for dirname in dirlists: dirlist = dirlists[dirname] save_season = season for item in get_list(dirlist): if item is not None: if season is None: if item[0] is None: season = seasonfromname(info['name']) if season is None: try: season = seasonfromname(dirname) except: pass else: season = item[0] name = item[2] index = item[3] files.append({ 'name': name, 'season': season, 'episode': item[1], 'index': index }) season = save_season else: # TODO continue files.sort(key=lambda x: (x['season'], x['episode'])) return files