Browse Source

Provide IDs to check to all downloaders

pull/2545/head
mano3m 12 years ago
parent
commit
cff1b3abdb
  1. 11
      couchpotato/core/downloaders/base.py
  2. 67
      couchpotato/core/downloaders/deluge/main.py
  3. 69
      couchpotato/core/downloaders/nzbget/main.py
  4. 40
      couchpotato/core/downloaders/nzbvortex/main.py
  5. 45
      couchpotato/core/downloaders/rtorrent/main.py
  6. 55
      couchpotato/core/downloaders/sabnzbd/main.py
  7. 53
      couchpotato/core/downloaders/transmission/main.py
  8. 85
      couchpotato/core/downloaders/utorrent/main.py
  9. 15
      couchpotato/core/plugins/renamer/main.py

11
couchpotato/core/downloaders/base.py

@ -57,13 +57,18 @@ class Downloader(Provider):
return return
return self.download(data = data, media = media, filedata = filedata) return self.download(data = data, media = media, filedata = filedata)
def _getAllDownloadStatus(self): def _getAllDownloadStatus(self, download_ids):
if self.isDisabled(manual = True, data = {}): if self.isDisabled(manual = True, data = {}):
return return
return self.getAllDownloadStatus() ids = [download_id['id'] for download_id in download_ids if download_id['downloader'] == self.getName()]
def getAllDownloadStatus(self): if ids:
return self.getAllDownloadStatus(ids)
else:
return
def getAllDownloadStatus(self, ids):
return return
def _removeFailed(self, release_download): def _removeFailed(self, release_download):

67
couchpotato/core/downloaders/deluge/main.py

@ -86,7 +86,7 @@ class Deluge(Downloader):
log.info('Torrent sent to Deluge successfully.') log.info('Torrent sent to Deluge successfully.')
return self.downloadReturnId(remote_torrent) return self.downloadReturnId(remote_torrent)
def getAllDownloadStatus(self): def getAllDownloadStatus(self, ids):
log.debug('Checking Deluge download status.') log.debug('Checking Deluge download status.')
@ -103,38 +103,39 @@ class Deluge(Downloader):
for torrent_id in queue: for torrent_id in queue:
torrent = queue[torrent_id] torrent = queue[torrent_id]
log.debug('name=%s / id=%s / save_path=%s / move_completed_path=%s / hash=%s / progress=%s / state=%s / eta=%s / ratio=%s / stop_ratio=%s / is_seed=%s / is_finished=%s / paused=%s', (torrent['name'], torrent['hash'], torrent['save_path'], torrent['move_completed_path'], torrent['hash'], torrent['progress'], torrent['state'], torrent['eta'], torrent['ratio'], torrent['stop_ratio'], torrent['is_seed'], torrent['is_finished'], torrent['paused'])) if torrent['hash'] in ids:
log.debug('name=%s / id=%s / save_path=%s / move_completed_path=%s / hash=%s / progress=%s / state=%s / eta=%s / ratio=%s / stop_ratio=%s / is_seed=%s / is_finished=%s / paused=%s', (torrent['name'], torrent['hash'], torrent['save_path'], torrent['move_completed_path'], torrent['hash'], torrent['progress'], torrent['state'], torrent['eta'], torrent['ratio'], torrent['stop_ratio'], torrent['is_seed'], torrent['is_finished'], torrent['paused']))
# Deluge has no easy way to work out if a torrent is stalled or failing.
#status = 'failed' # Deluge has no easy way to work out if a torrent is stalled or failing.
status = 'busy' #status = 'failed'
if torrent['is_seed'] and tryFloat(torrent['ratio']) < tryFloat(torrent['stop_ratio']): status = 'busy'
# We have torrent['seeding_time'] to work out what the seeding time is, but we do not if torrent['is_seed'] and tryFloat(torrent['ratio']) < tryFloat(torrent['stop_ratio']):
# have access to the downloader seed_time, as with deluge we have no way to pass it # We have torrent['seeding_time'] to work out what the seeding time is, but we do not
# when the torrent is added. So Deluge will only look at the ratio. # have access to the downloader seed_time, as with deluge we have no way to pass it
# See above comment in download(). # when the torrent is added. So Deluge will only look at the ratio.
status = 'seeding' # See above comment in download().
elif torrent['is_seed'] and torrent['is_finished'] and torrent['paused'] and torrent['state'] == 'Paused': status = 'seeding'
status = 'completed' elif torrent['is_seed'] and torrent['is_finished'] and torrent['paused'] and torrent['state'] == 'Paused':
status = 'completed'
download_dir = sp(torrent['save_path'])
if torrent['move_on_completed']: download_dir = sp(torrent['save_path'])
download_dir = torrent['move_completed_path'] if torrent['move_on_completed']:
download_dir = torrent['move_completed_path']
torrent_files = []
for file_item in torrent['files']: torrent_files = []
torrent_files.append(sp(os.path.join(download_dir, file_item['path']))) for file_item in torrent['files']:
torrent_files.append(sp(os.path.join(download_dir, file_item['path'])))
release_downloads.append({
'id': torrent['hash'], release_downloads.append({
'name': torrent['name'], 'id': torrent['hash'],
'status': status, 'name': torrent['name'],
'original_status': torrent['state'], 'status': status,
'seed_ratio': torrent['ratio'], 'original_status': torrent['state'],
'timeleft': str(timedelta(seconds = torrent['eta'])), 'seed_ratio': torrent['ratio'],
'folder': sp(download_dir if len(torrent_files) == 1 else os.path.join(download_dir, torrent['name'])), 'timeleft': str(timedelta(seconds = torrent['eta'])),
'files': '|'.join(torrent_files), 'folder': sp(download_dir if len(torrent_files) == 1 else os.path.join(download_dir, torrent['name'])),
}) 'files': '|'.join(torrent_files),
})
return release_downloads return release_downloads

69
couchpotato/core/downloaders/nzbget/main.py

@ -67,7 +67,7 @@ class NZBGet(Downloader):
log.error('NZBGet could not add %s to the queue.', nzb_name) log.error('NZBGet could not add %s to the queue.', nzb_name)
return False return False
def getAllDownloadStatus(self): def getAllDownloadStatus(self, ids):
log.debug('Checking NZBGet download status.') log.debug('Checking NZBGet download status.')
@ -102,51 +102,54 @@ class NZBGet(Downloader):
release_downloads = ReleaseDownloadList(self) release_downloads = ReleaseDownloadList(self)
for nzb in groups: for nzb in groups:
log.debug('Found %s in NZBGet download queue', nzb['NZBFilename'])
try: try:
nzb_id = [param['Value'] for param in nzb['Parameters'] if param['Name'] == 'couchpotato'][0] nzb_id = [param['Value'] for param in nzb['Parameters'] if param['Name'] == 'couchpotato'][0]
except: except:
nzb_id = nzb['NZBID'] nzb_id = nzb['NZBID']
if nzb_id in ids:
timeleft = -1 log.debug('Found %s in NZBGet download queue', nzb['NZBFilename'])
try: timeleft = -1
if nzb['ActiveDownloads'] > 0 and nzb['DownloadRate'] > 0 and not (status['DownloadPaused'] or status['Download2Paused']): try:
timeleft = str(timedelta(seconds = nzb['RemainingSizeMB'] / status['DownloadRate'] * 2 ^ 20)) if nzb['ActiveDownloads'] > 0 and nzb['DownloadRate'] > 0 and not (status['DownloadPaused'] or status['Download2Paused']):
except: timeleft = str(timedelta(seconds = nzb['RemainingSizeMB'] / status['DownloadRate'] * 2 ^ 20))
pass except:
pass
release_downloads.append({
'id': nzb_id, release_downloads.append({
'name': nzb['NZBFilename'], 'id': nzb_id,
'original_status': 'DOWNLOADING' if nzb['ActiveDownloads'] > 0 else 'QUEUED', 'name': nzb['NZBFilename'],
# Seems to have no native API function for time left. This will return the time left after NZBGet started downloading this item 'original_status': 'DOWNLOADING' if nzb['ActiveDownloads'] > 0 else 'QUEUED',
'timeleft': timeleft, # Seems to have no native API function for time left. This will return the time left after NZBGet started downloading this item
}) 'timeleft': timeleft,
})
for nzb in queue: # 'Parameters' is not passed in rpc.postqueue for nzb in queue: # 'Parameters' is not passed in rpc.postqueue
log.debug('Found %s in NZBGet postprocessing queue', nzb['NZBFilename']) if nzb['NZBID'] in ids:
release_downloads.append({ log.debug('Found %s in NZBGet postprocessing queue', nzb['NZBFilename'])
'id': nzb['NZBID'], release_downloads.append({
'name': nzb['NZBFilename'], 'id': nzb['NZBID'],
'original_status': nzb['Stage'], 'name': nzb['NZBFilename'],
'timeleft': str(timedelta(seconds = 0)) if not status['PostPaused'] else -1, 'original_status': nzb['Stage'],
}) 'timeleft': str(timedelta(seconds = 0)) if not status['PostPaused'] else -1,
})
for nzb in history: for nzb in history:
log.debug('Found %s in NZBGet history. ParStatus: %s, ScriptStatus: %s, Log: %s', (nzb['NZBFilename'] , nzb['ParStatus'], nzb['ScriptStatus'] , nzb['Log']))
try: try:
nzb_id = [param['Value'] for param in nzb['Parameters'] if param['Name'] == 'couchpotato'][0] nzb_id = [param['Value'] for param in nzb['Parameters'] if param['Name'] == 'couchpotato'][0]
except: except:
nzb_id = nzb['NZBID'] nzb_id = nzb['NZBID']
release_downloads.append({
'id': nzb_id, if nzb_id in ids:
'name': nzb['NZBFilename'], log.debug('Found %s in NZBGet history. ParStatus: %s, ScriptStatus: %s, Log: %s', (nzb['NZBFilename'] , nzb['ParStatus'], nzb['ScriptStatus'] , nzb['Log']))
'status': 'completed' if nzb['ParStatus'] in ['SUCCESS', 'NONE'] and nzb['ScriptStatus'] in ['SUCCESS', 'NONE'] else 'failed', release_downloads.append({
'original_status': nzb['ParStatus'] + ', ' + nzb['ScriptStatus'], 'id': nzb_id,
'timeleft': str(timedelta(seconds = 0)), 'name': nzb['NZBFilename'],
'folder': sp(nzb['DestDir']) 'status': 'completed' if nzb['ParStatus'] in ['SUCCESS', 'NONE'] and nzb['ScriptStatus'] in ['SUCCESS', 'NONE'] else 'failed',
}) 'original_status': nzb['ParStatus'] + ', ' + nzb['ScriptStatus'],
'timeleft': str(timedelta(seconds = 0)),
'folder': sp(nzb['DestDir'])
})
return release_downloads return release_downloads

40
couchpotato/core/downloaders/nzbvortex/main.py

@ -8,9 +8,11 @@ from uuid import uuid4
import hashlib import hashlib
import httplib import httplib
import json import json
import os
import socket import socket
import ssl import ssl
import sys import sys
import time
import traceback import traceback
import urllib2 import urllib2
@ -32,35 +34,37 @@ class NZBVortex(Downloader):
nzb_filename = self.createFileName(data, filedata, media) nzb_filename = self.createFileName(data, filedata, media)
self.call('nzb/add', params = {'file': (nzb_filename, filedata)}, multipart = True) self.call('nzb/add', params = {'file': (nzb_filename, filedata)}, multipart = True)
time.sleep(10)
raw_statuses = self.call('nzb') raw_statuses = self.call('nzb')
nzb_id = [nzb['id'] for nzb in raw_statuses.get('nzbs', []) if nzb['name'] == nzb_filename][0] nzb_id = [nzb['id'] for nzb in raw_statuses.get('nzbs', []) if os.path.basename(item['nzbFileName']) == nzb_filename][0]
return self.downloadReturnId(nzb_id) return self.downloadReturnId(nzb_id)
except: except:
log.error('Something went wrong sending the NZB file: %s', traceback.format_exc()) log.error('Something went wrong sending the NZB file: %s', traceback.format_exc())
return False return False
def getAllDownloadStatus(self): def getAllDownloadStatus(self, ids):
raw_statuses = self.call('nzb') raw_statuses = self.call('nzb')
release_downloads = ReleaseDownloadList(self) release_downloads = ReleaseDownloadList(self)
for nzb in raw_statuses.get('nzbs', []): for nzb in raw_statuses.get('nzbs', []):
if nzb['id'] in ids:
# Check status
status = 'busy' # Check status
if nzb['state'] == 20: status = 'busy'
status = 'completed' if nzb['state'] == 20:
elif nzb['state'] in [21, 22, 24]: status = 'completed'
status = 'failed' elif nzb['state'] in [21, 22, 24]:
status = 'failed'
release_downloads.append({
'id': nzb['id'], release_downloads.append({
'name': nzb['uiTitle'], 'id': nzb['id'],
'status': status, 'name': nzb['uiTitle'],
'original_status': nzb['state'], 'status': status,
'timeleft':-1, 'original_status': nzb['state'],
'folder': sp(nzb['destinationPath']), 'timeleft':-1,
}) 'folder': sp(nzb['destinationPath']),
})
return release_downloads return release_downloads

45
couchpotato/core/downloaders/rtorrent/main.py

@ -143,7 +143,7 @@ class rTorrent(Downloader):
log.error('Failed to send torrent to rTorrent: %s', err) log.error('Failed to send torrent to rTorrent: %s', err)
return False return False
def getAllDownloadStatus(self): def getAllDownloadStatus(self, ids):
log.debug('Checking rTorrent download status.') log.debug('Checking rTorrent download status.')
if not self.connect(): if not self.connect():
@ -155,27 +155,28 @@ class rTorrent(Downloader):
release_downloads = ReleaseDownloadList(self) release_downloads = ReleaseDownloadList(self)
for torrent in torrents: for torrent in torrents:
torrent_files = [] if torrent.info_hash in ids:
for file_item in torrent.get_files(): torrent_files = []
torrent_files.append(sp(os.path.join(torrent.directory, file_item.path))) for file_item in torrent.get_files():
torrent_files.append(sp(os.path.join(torrent.directory, file_item.path)))
status = 'busy'
if torrent.complete: status = 'busy'
if torrent.active: if torrent.complete:
status = 'seeding' if torrent.active:
else: status = 'seeding'
status = 'completed' else:
status = 'completed'
release_downloads.append({
'id': torrent.info_hash, release_downloads.append({
'name': torrent.name, 'id': torrent.info_hash,
'status': status, 'name': torrent.name,
'seed_ratio': torrent.ratio, 'status': status,
'original_status': torrent.state, 'seed_ratio': torrent.ratio,
'timeleft': str(timedelta(seconds = float(torrent.left_bytes) / torrent.down_rate)) if torrent.down_rate > 0 else -1, 'original_status': torrent.state,
'folder': sp(torrent.directory), 'timeleft': str(timedelta(seconds = float(torrent.left_bytes) / torrent.down_rate)) if torrent.down_rate > 0 else -1,
'files': '|'.join(torrent_files) 'folder': sp(torrent.directory),
}) 'files': '|'.join(torrent_files)
})
return release_downloads return release_downloads

55
couchpotato/core/downloaders/sabnzbd/main.py

@ -64,7 +64,7 @@ class Sabnzbd(Downloader):
log.error('Error getting data from SABNZBd: %s', sab_data) log.error('Error getting data from SABNZBd: %s', sab_data)
return False return False
def getAllDownloadStatus(self): def getAllDownloadStatus(self, ids):
log.debug('Checking SABnzbd download status.') log.debug('Checking SABnzbd download status.')
@ -91,35 +91,36 @@ class Sabnzbd(Downloader):
# Get busy releases # Get busy releases
for nzb in queue.get('slots', []): for nzb in queue.get('slots', []):
status = 'busy' if nzb['nzo_id'] in ids:
if 'ENCRYPTED / ' in nzb['filename']: status = 'busy'
status = 'failed' if 'ENCRYPTED / ' in nzb['filename']:
status = 'failed'
release_downloads.append({
'id': nzb['nzo_id'], release_downloads.append({
'name': nzb['filename'], 'id': nzb['nzo_id'],
'status': status, 'name': nzb['filename'],
'original_status': nzb['status'], 'status': status,
'timeleft': nzb['timeleft'] if not queue['paused'] else -1, 'original_status': nzb['status'],
}) 'timeleft': nzb['timeleft'] if not queue['paused'] else -1,
})
# Get old releases # Get old releases
for nzb in history.get('slots', []): for nzb in history.get('slots', []):
if nzb['nzo_id'] in ids:
status = 'busy' status = 'busy'
if nzb['status'] == 'Failed' or (nzb['status'] == 'Completed' and nzb['fail_message'].strip()): if nzb['status'] == 'Failed' or (nzb['status'] == 'Completed' and nzb['fail_message'].strip()):
status = 'failed' status = 'failed'
elif nzb['status'] == 'Completed': elif nzb['status'] == 'Completed':
status = 'completed' status = 'completed'
release_downloads.append({ release_downloads.append({
'id': nzb['nzo_id'], 'id': nzb['nzo_id'],
'name': nzb['name'], 'name': nzb['name'],
'status': status, 'status': status,
'original_status': nzb['status'], 'original_status': nzb['status'],
'timeleft': str(timedelta(seconds = 0)), 'timeleft': str(timedelta(seconds = 0)),
'folder': sp(os.path.dirname(nzb['storage']) if os.path.isfile(nzb['storage']) else nzb['storage']), 'folder': sp(os.path.dirname(nzb['storage']) if os.path.isfile(nzb['storage']) else nzb['storage']),
}) })
return release_downloads return release_downloads

53
couchpotato/core/downloaders/transmission/main.py

@ -83,7 +83,7 @@ class Transmission(Downloader):
log.info('Torrent sent to Transmission successfully.') log.info('Torrent sent to Transmission successfully.')
return self.downloadReturnId(remote_torrent['torrent-added']['hashString']) return self.downloadReturnId(remote_torrent['torrent-added']['hashString'])
def getAllDownloadStatus(self): def getAllDownloadStatus(self, ids):
log.debug('Checking Transmission download status.') log.debug('Checking Transmission download status.')
@ -102,31 +102,32 @@ class Transmission(Downloader):
return False return False
for torrent in queue['torrents']: for torrent in queue['torrents']:
log.debug('name=%s / id=%s / downloadDir=%s / hashString=%s / percentDone=%s / status=%s / eta=%s / uploadRatio=%s / isFinished=%s', if torrent['hashString'] in ids:
(torrent['name'], torrent['id'], torrent['downloadDir'], torrent['hashString'], torrent['percentDone'], torrent['status'], torrent['eta'], torrent['uploadRatio'], torrent['isFinished'])) log.debug('name=%s / id=%s / downloadDir=%s / hashString=%s / percentDone=%s / status=%s / eta=%s / uploadRatio=%s / isFinished=%s',
(torrent['name'], torrent['id'], torrent['downloadDir'], torrent['hashString'], torrent['percentDone'], torrent['status'], torrent['eta'], torrent['uploadRatio'], torrent['isFinished']))
torrent_files = []
for file_item in torrent['files']: torrent_files = []
torrent_files.append(sp(os.path.join(torrent['downloadDir'], file_item['name']))) for file_item in torrent['files']:
torrent_files.append(sp(os.path.join(torrent['downloadDir'], file_item['name'])))
status = 'busy'
if torrent.get('isStalled') and self.conf('stalled_as_failed'): status = 'busy'
status = 'failed' if torrent.get('isStalled') and self.conf('stalled_as_failed'):
elif torrent['status'] == 0 and torrent['percentDone'] == 1: status = 'failed'
status = 'completed' elif torrent['status'] == 0 and torrent['percentDone'] == 1:
elif torrent['status'] in [5, 6]: status = 'completed'
status = 'seeding' elif torrent['status'] in [5, 6]:
status = 'seeding'
release_downloads.append({
'id': torrent['hashString'], release_downloads.append({
'name': torrent['name'], 'id': torrent['hashString'],
'status': status, 'name': torrent['name'],
'original_status': torrent['status'], 'status': status,
'seed_ratio': torrent['uploadRatio'], 'original_status': torrent['status'],
'timeleft': str(timedelta(seconds = torrent['eta'])), 'seed_ratio': torrent['uploadRatio'],
'folder': sp(torrent['downloadDir'] if len(torrent_files) == 1 else os.path.join(torrent['downloadDir'], torrent['name'])), 'timeleft': str(timedelta(seconds = torrent['eta'])),
'files': '|'.join(torrent_files) 'folder': sp(torrent['downloadDir'] if len(torrent_files) == 1 else os.path.join(torrent['downloadDir'], torrent['name'])),
}) 'files': '|'.join(torrent_files)
})
return release_downloads return release_downloads

85
couchpotato/core/downloaders/utorrent/main.py

@ -105,7 +105,7 @@ class uTorrent(Downloader):
return self.downloadReturnId(torrent_hash) return self.downloadReturnId(torrent_hash)
def getAllDownloadStatus(self): def getAllDownloadStatus(self, ids):
log.debug('Checking uTorrent download status.') log.debug('Checking uTorrent download status.')
@ -130,47 +130,48 @@ class uTorrent(Downloader):
# Get torrents # Get torrents
for torrent in queue['torrents']: for torrent in queue['torrents']:
if torrent[0] in ids:
#Get files of the torrent
torrent_files = [] #Get files of the torrent
try: torrent_files = []
torrent_files = json.loads(self.utorrent_api.get_files(torrent[0])) try:
torrent_files = [sp(os.path.join(torrent[26], torrent_file[0])) for torrent_file in torrent_files['files'][1]] torrent_files = json.loads(self.utorrent_api.get_files(torrent[0]))
except: torrent_files = [sp(os.path.join(torrent[26], torrent_file[0])) for torrent_file in torrent_files['files'][1]]
log.debug('Failed getting files from torrent: %s', torrent[2]) except:
log.debug('Failed getting files from torrent: %s', torrent[2])
status_flags = {
"STARTED" : 1, status_flags = {
"CHECKING" : 2, "STARTED" : 1,
"CHECK-START" : 4, "CHECKING" : 2,
"CHECKED" : 8, "CHECK-START" : 4,
"ERROR" : 16, "CHECKED" : 8,
"PAUSED" : 32, "ERROR" : 16,
"QUEUED" : 64, "PAUSED" : 32,
"LOADED" : 128 "QUEUED" : 64,
} "LOADED" : 128
}
status = 'busy'
if (torrent[1] & status_flags["STARTED"] or torrent[1] & status_flags["QUEUED"]) and torrent[4] == 1000: status = 'busy'
status = 'seeding' if (torrent[1] & status_flags["STARTED"] or torrent[1] & status_flags["QUEUED"]) and torrent[4] == 1000:
elif (torrent[1] & status_flags["ERROR"]): status = 'seeding'
status = 'failed' elif (torrent[1] & status_flags["ERROR"]):
elif torrent[4] == 1000: status = 'failed'
status = 'completed' elif torrent[4] == 1000:
status = 'completed'
if not status == 'busy':
self.removeReadOnly(torrent_files) if not status == 'busy':
self.removeReadOnly(torrent_files)
release_downloads.append({
'id': torrent[0], release_downloads.append({
'name': torrent[2], 'id': torrent[0],
'status': status, 'name': torrent[2],
'seed_ratio': float(torrent[7]) / 1000, 'status': status,
'original_status': torrent[1], 'seed_ratio': float(torrent[7]) / 1000,
'timeleft': str(timedelta(seconds = torrent[10])), 'original_status': torrent[1],
'folder': sp(torrent[26]), 'timeleft': str(timedelta(seconds = torrent[10])),
'files': '|'.join(torrent_files) 'folder': sp(torrent[26]),
}) 'files': '|'.join(torrent_files)
})
return release_downloads return release_downloads

15
couchpotato/core/plugins/renamer/main.py

@ -811,9 +811,20 @@ Remove it if you want it to be renamed (again, or at least let it try again)
self.checking_snatched = False self.checking_snatched = False
return True return True
release_downloads = fireEvent('download.status', merge = True) # Collect all download information with the download IDs from the releases
download_ids = []
try:
for rel in rels:
rel_dict = rel.to_dict({'info': {}})
if rel_dict['info'].get('download_id'):
download_ids.append({'id': rel_dict['info']['download_id'], 'downloader': rel_dict['info']['download_downloader']})
except:
log.error('Error getting download IDs from database')
return False
release_downloads = fireEvent('download.status', download_ids, merge = True)
if not release_downloads: if not release_downloads:
log.debug('Download status functionality is not implemented for active downloaders.') log.debug('Download status functionality is not implemented for any active downloaders.')
fireEvent('renamer.scan') fireEvent('renamer.scan')
self.checking_snatched = False self.checking_snatched = False

Loading…
Cancel
Save