Merge branch 'refs/heads/mano3m-develop_release' into develop
This commit is contained in:
@@ -60,7 +60,7 @@ class Searcher(SearcherBase):
|
|||||||
|
|
||||||
if downloader_enabled:
|
if downloader_enabled:
|
||||||
|
|
||||||
snatched_status = fireEvent('status.get', 'snatched', single = True)
|
snatched_status, done_status, active_status = fireEvent('status.get', ['snatched', 'done', 'active'], single = True)
|
||||||
|
|
||||||
# Download movie to temp
|
# Download movie to temp
|
||||||
filedata = None
|
filedata = None
|
||||||
@@ -79,9 +79,7 @@ class Searcher(SearcherBase):
|
|||||||
rls = db.query(Release).filter_by(identifier = md5(data['url'])).first()
|
rls = db.query(Release).filter_by(identifier = md5(data['url'])).first()
|
||||||
if rls:
|
if rls:
|
||||||
renamer_enabled = Env.setting('enabled', 'renamer')
|
renamer_enabled = Env.setting('enabled', 'renamer')
|
||||||
|
fireEvent('release.update_status', rls.id, status = done_status if not renamer_enabled else snatched_status, single = True)
|
||||||
done_status = fireEvent('status.get', 'done', single = True)
|
|
||||||
rls.status_id = done_status.get('id') if not renamer_enabled else snatched_status.get('id')
|
|
||||||
|
|
||||||
# Save download-id info if returned
|
# Save download-id info if returned
|
||||||
if isinstance(download_result, dict):
|
if isinstance(download_result, dict):
|
||||||
@@ -100,20 +98,12 @@ class Searcher(SearcherBase):
|
|||||||
|
|
||||||
# If renamer isn't used, mark movie done
|
# If renamer isn't used, mark movie done
|
||||||
if not renamer_enabled:
|
if not renamer_enabled:
|
||||||
active_status = fireEvent('status.get', 'active', single = True)
|
|
||||||
done_status = fireEvent('status.get', 'done', single = True)
|
|
||||||
try:
|
try:
|
||||||
if movie['status_id'] == active_status.get('id'):
|
if movie['status_id'] == active_status.get('id'):
|
||||||
for profile_type in movie['profile']['types']:
|
for profile_type in movie['profile']['types']:
|
||||||
if profile_type['quality_id'] == rls.quality.id and profile_type['finish']:
|
if profile_type['quality_id'] == rls.quality.id and profile_type['finish']:
|
||||||
log.info('Renamer disabled, marking movie as finished: %s', log_movie)
|
|
||||||
|
|
||||||
# Mark release done
|
|
||||||
rls.status_id = done_status.get('id')
|
|
||||||
rls.last_edit = int(time.time())
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Mark movie done
|
# Mark movie done
|
||||||
|
log.info('Renamer disabled, marking movie as finished: %s', log_movie)
|
||||||
mvie = db.query(Movie).filter_by(id = movie['id']).first()
|
mvie = db.query(Movie).filter_by(id = movie['id']).first()
|
||||||
mvie.status_id = done_status.get('id')
|
mvie.status_id = done_status.get('id')
|
||||||
mvie.last_edit = int(time.time())
|
mvie.last_edit = int(time.time())
|
||||||
|
|||||||
@@ -241,7 +241,6 @@ MA.Release = new Class({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
).inject(self.release_container);
|
).inject(self.release_container);
|
||||||
|
|
||||||
release['el'] = item;
|
release['el'] = item;
|
||||||
|
|
||||||
if(status.identifier == 'ignored' || status.identifier == 'failed' || status.identifier == 'snatched'){
|
if(status.identifier == 'ignored' || status.identifier == 'failed' || status.identifier == 'snatched'){
|
||||||
@@ -251,6 +250,30 @@ MA.Release = new Class({
|
|||||||
else if(!self.next_release && status.identifier == 'available'){
|
else if(!self.next_release && status.identifier == 'available'){
|
||||||
self.next_release = release;
|
self.next_release = release;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var update_handle = function(notification) {
|
||||||
|
var q = self.movie.quality.getElement('.q_id' + release.quality_id),
|
||||||
|
status = Status.get(release.status_id),
|
||||||
|
new_status = Status.get(notification.data);
|
||||||
|
|
||||||
|
release.status_id = new_status.id
|
||||||
|
release.el.set('class', 'item ' + new_status.identifier);
|
||||||
|
|
||||||
|
var status_el = release.el.getElement('.release_status');
|
||||||
|
status_el.set('class', 'release_status ' + new_status.identifier);
|
||||||
|
status_el.set('text', new_status.identifier);
|
||||||
|
|
||||||
|
if(!q && (new_status.identifier == 'snatched' || new_status.identifier == 'seeding' || new_status.identifier == 'done'))
|
||||||
|
var q = self.addQuality(release.quality_id);
|
||||||
|
|
||||||
|
if(new_status && q && !q.hasClass(new_status.identifier)) {
|
||||||
|
q.removeClass(status.identifier).addClass(new_status.identifier);
|
||||||
|
q.set('title', q.get('title').replace(status.label, new_status.label));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
App.addEvent('release.update_status.' + release.id, update_handle);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if(self.last_release)
|
if(self.last_release)
|
||||||
@@ -397,17 +420,6 @@ MA.Release = new Class({
|
|||||||
'data': {
|
'data': {
|
||||||
'id': release.id
|
'id': release.id
|
||||||
},
|
},
|
||||||
'onComplete': function(){
|
|
||||||
var el = release.el;
|
|
||||||
if(el && (el.hasClass('failed') || el.hasClass('ignored'))){
|
|
||||||
el.removeClass('failed').removeClass('ignored');
|
|
||||||
el.getElement('.release_status').set('text', 'available');
|
|
||||||
}
|
|
||||||
else if(el) {
|
|
||||||
el.addClass('ignored');
|
|
||||||
el.getElement('.release_status').set('text', 'ignored');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -419,22 +419,25 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.movies .data .quality .available,
|
.movies .data .quality .available,
|
||||||
.movies .data .quality .snatched {
|
.movies .data .quality .snatched,
|
||||||
|
.movies .data .quality .seeding {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.movies .data .quality .available { background-color: #578bc3; }
|
.movies .data .quality .available { background-color: #578bc3; }
|
||||||
.movies .data .quality .failed { background-color: #a43d34; }
|
.movies .data .quality .failed,
|
||||||
|
.movies .data .quality .missing,
|
||||||
|
.movies .data .quality .ignored { background-color: #a43d34; }
|
||||||
.movies .data .quality .snatched { background-color: #a2a232; }
|
.movies .data .quality .snatched { background-color: #a2a232; }
|
||||||
.movies .data .quality .seeding { background-color: #0a6819; }
|
|
||||||
.movies .data .quality .done {
|
.movies .data .quality .done {
|
||||||
background-color: #369545;
|
background-color: #369545;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
.movies .data .quality .seeding { background-color: #0a6819; }
|
||||||
.movies .data .quality .finish {
|
.movies .data .quality .finish {
|
||||||
background-image: url('../images/sprite.png');
|
background-image: url('../images/sprite.png');
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: 0 2px;
|
background-position: 0 2px;
|
||||||
padding-left: 14px;
|
padding-left: 14px;
|
||||||
background-size: 14px
|
background-size: 14px
|
||||||
@@ -646,7 +649,7 @@
|
|||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.trailer_container.hide {
|
.trailer_container.hide {
|
||||||
height: 0 !important;
|
height: 0 !important;
|
||||||
}
|
}
|
||||||
@@ -1029,7 +1032,7 @@
|
|||||||
.movies .progress > div .folder {
|
.movies .progress > div .folder {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 5px 20px 5px 0;
|
padding: 5px 20px 5px 0;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
width: 85%;
|
width: 85%;
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ var Movie = new Class({
|
|||||||
var q = self.quality.getElement('.q_id'+ release.quality_id),
|
var q = self.quality.getElement('.q_id'+ release.quality_id),
|
||||||
status = Status.get(release.status_id);
|
status = Status.get(release.status_id);
|
||||||
|
|
||||||
if(!q && (status.identifier == 'snatched' || status.identifier == 'done'))
|
if(!q && (status.identifier == 'snatched' || status.identifier == 'seeding' || status.identifier == 'done'))
|
||||||
var q = self.addQuality(release.quality_id)
|
var q = self.addQuality(release.quality_id)
|
||||||
|
|
||||||
if (status && q && !q.hasClass(status.identifier)){
|
if (status && q && !q.hasClass(status.identifier)){
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from sqlalchemy.orm import joinedload_all
|
|||||||
from sqlalchemy.sql.expression import and_, or_
|
from sqlalchemy.sql.expression import and_, or_
|
||||||
import os
|
import os
|
||||||
import traceback
|
import traceback
|
||||||
|
import time
|
||||||
|
|
||||||
log = CPLog(__name__)
|
log = CPLog(__name__)
|
||||||
|
|
||||||
@@ -47,6 +48,7 @@ class Release(Plugin):
|
|||||||
addEvent('release.for_movie', self.forMovie)
|
addEvent('release.for_movie', self.forMovie)
|
||||||
addEvent('release.delete', self.delete)
|
addEvent('release.delete', self.delete)
|
||||||
addEvent('release.clean', self.clean)
|
addEvent('release.clean', self.clean)
|
||||||
|
addEvent('release.update_status', self.updateStatus)
|
||||||
|
|
||||||
def add(self, group):
|
def add(self, group):
|
||||||
|
|
||||||
@@ -159,8 +161,7 @@ class Release(Plugin):
|
|||||||
rel = db.query(Relea).filter_by(id = id).first()
|
rel = db.query(Relea).filter_by(id = id).first()
|
||||||
if rel:
|
if rel:
|
||||||
ignored_status, failed_status, available_status = fireEvent('status.get', ['ignored', 'failed', 'available'], single = True)
|
ignored_status, failed_status, available_status = fireEvent('status.get', ['ignored', 'failed', 'available'], single = True)
|
||||||
rel.status_id = available_status.get('id') if rel.status_id in [ignored_status.get('id'), failed_status.get('id')] else ignored_status.get('id')
|
self.updateStatus(id, available_status if rel.status_id in [ignored_status.get('id'), failed_status.get('id')] else ignored_status)
|
||||||
db.commit()
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True
|
'success': True
|
||||||
@@ -199,14 +200,9 @@ class Release(Plugin):
|
|||||||
|
|
||||||
if success:
|
if success:
|
||||||
db.expunge_all()
|
db.expunge_all()
|
||||||
rel = db.query(Relea).filter_by(id = id).first() # Get release again
|
rel = db.query(Relea).filter_by(id = id).first() # Get release again @RuudBurger why do we need to get it again??
|
||||||
|
|
||||||
if rel.status_id != done_status.get('id'):
|
|
||||||
rel.status_id = snatched_status.get('id')
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
fireEvent('notify.frontend', type = 'release.download', data = True, message = 'Successfully snatched "%s"' % item['name'])
|
fireEvent('notify.frontend', type = 'release.download', data = True, message = 'Successfully snatched "%s"' % item['name'])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': success
|
'success': success
|
||||||
}
|
}
|
||||||
@@ -241,3 +237,23 @@ class Release(Plugin):
|
|||||||
'success': True
|
'success': True
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def updateStatus(self, id, status = None):
|
||||||
|
if not status: return
|
||||||
|
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
|
rel = db.query(Relea).filter_by(id = id).first()
|
||||||
|
if rel and status and rel.status_id != status.get('id'):
|
||||||
|
|
||||||
|
item = {}
|
||||||
|
for info in rel.info:
|
||||||
|
item[info.identifier] = info.value
|
||||||
|
|
||||||
|
#update status in Db
|
||||||
|
log.debug('Marking release %s as %s', (item['name'], status.get("label")))
|
||||||
|
rel.status_id = status.get('id')
|
||||||
|
rel.last_edit = int(time.time())
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
#Update all movie info as there is no release update function
|
||||||
|
fireEvent('notify.frontend', type = 'release.update_status.%s' % rel.id, data = status.get('id'))
|
||||||
|
|||||||
@@ -395,14 +395,8 @@ class Renamer(Plugin):
|
|||||||
break
|
break
|
||||||
elif release.status_id is snatched_status.get('id'):
|
elif release.status_id is snatched_status.get('id'):
|
||||||
if release.quality.id is group['meta_data']['quality']['id']:
|
if release.quality.id is group['meta_data']['quality']['id']:
|
||||||
log.debug('Marking release as downloaded')
|
# Set the release to downloaded
|
||||||
try:
|
fireEvent('release.update_status', release.id, status = downloaded_status, single = True)
|
||||||
release.status_id = downloaded_status.get('id')
|
|
||||||
release.last_edit = int(time.time())
|
|
||||||
except Exception, e:
|
|
||||||
log.error('Failed marking release as finished: %s %s', (e, traceback.format_exc()))
|
|
||||||
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Remove leftover files
|
# Remove leftover files
|
||||||
if not remove_leftovers: # Don't remove anything
|
if not remove_leftovers: # Don't remove anything
|
||||||
@@ -663,12 +657,13 @@ Remove it if you want it to be renamed (again, or at least let it try again)
|
|||||||
|
|
||||||
self.checking_snatched = True
|
self.checking_snatched = True
|
||||||
|
|
||||||
snatched_status, ignored_status, failed_status, done_status, seeding_status, downloaded_status = \
|
snatched_status, ignored_status, failed_status, done_status, seeding_status, downloaded_status, missing_status = \
|
||||||
fireEvent('status.get', ['snatched', 'ignored', 'failed', 'done', 'seeding', 'downloaded'], single = True)
|
fireEvent('status.get', ['snatched', 'ignored', 'failed', 'done', 'seeding', 'downloaded', 'missing'], single = True)
|
||||||
|
|
||||||
db = get_session()
|
db = get_session()
|
||||||
rels = db.query(Release).filter_by(status_id = snatched_status.get('id')).all()
|
rels = db.query(Release).filter_by(status_id = snatched_status.get('id')).all()
|
||||||
rels.extend(db.query(Release).filter_by(status_id = seeding_status.get('id')).all())
|
rels.extend(db.query(Release).filter_by(status_id = seeding_status.get('id')).all())
|
||||||
|
rels.extend(db.query(Release).filter_by(status_id = missing_status.get('id')).all())
|
||||||
|
|
||||||
scan_items = []
|
scan_items = []
|
||||||
scan_required = False
|
scan_required = False
|
||||||
@@ -684,7 +679,6 @@ Remove it if you want it to be renamed (again, or at least let it try again)
|
|||||||
try:
|
try:
|
||||||
for rel in rels:
|
for rel in rels:
|
||||||
rel_dict = rel.to_dict({'info': {}})
|
rel_dict = rel.to_dict({'info': {}})
|
||||||
|
|
||||||
movie_dict = fireEvent('movie.get', rel.movie_id, single = True)
|
movie_dict = fireEvent('movie.get', rel.movie_id, single = True)
|
||||||
|
|
||||||
# check status
|
# check status
|
||||||
@@ -706,11 +700,16 @@ Remove it if you want it to be renamed (again, or at least let it try again)
|
|||||||
log.debug('Found %s: %s, time to go: %s', (item['name'], item['status'].upper(), timeleft))
|
log.debug('Found %s: %s, time to go: %s', (item['name'], item['status'].upper(), timeleft))
|
||||||
|
|
||||||
if item['status'] == 'busy':
|
if item['status'] == 'busy':
|
||||||
|
# Set the release to snatched if it was missing before
|
||||||
|
fireEvent('release.update_status', rel.id, status = snatched_status, single = True)
|
||||||
|
|
||||||
# Tag folder if it is in the 'from' folder and it will not be processed because it is still downloading
|
# Tag folder if it is in the 'from' folder and it will not be processed because it is still downloading
|
||||||
if item['folder'] and self.conf('from') in item['folder']:
|
if item['folder'] and self.conf('from') in item['folder']:
|
||||||
self.tagDir(item['folder'], 'downloading')
|
self.tagDir(item['folder'], 'downloading')
|
||||||
|
|
||||||
elif item['status'] == 'seeding':
|
elif item['status'] == 'seeding':
|
||||||
|
# Set the release to seeding
|
||||||
|
fireEvent('release.update_status', rel.id, status = seeding_status, single = True)
|
||||||
|
|
||||||
#If linking setting is enabled, process release
|
#If linking setting is enabled, process release
|
||||||
if self.conf('file_action') != 'move' and not rel.status_id == seeding_status.get('id') and self.statusInfoComplete(item):
|
if self.conf('file_action') != 'move' and not rel.status_id == seeding_status.get('id') and self.statusInfoComplete(item):
|
||||||
@@ -719,26 +718,18 @@ Remove it if you want it to be renamed (again, or at least let it try again)
|
|||||||
# Remove the downloading tag
|
# Remove the downloading tag
|
||||||
self.untagDir(item['folder'], 'downloading')
|
self.untagDir(item['folder'], 'downloading')
|
||||||
|
|
||||||
rel.status_id = seeding_status.get('id')
|
|
||||||
rel.last_edit = int(time.time())
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Scan and set the torrent to paused if required
|
# Scan and set the torrent to paused if required
|
||||||
item.update({'pause': True, 'scan': True, 'process_complete': False})
|
item.update({'pause': True, 'scan': True, 'process_complete': False})
|
||||||
scan_items.append(item)
|
scan_items.append(item)
|
||||||
else:
|
else:
|
||||||
if rel.status_id != seeding_status.get('id'):
|
|
||||||
rel.status_id = seeding_status.get('id')
|
|
||||||
rel.last_edit = int(time.time())
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
#let it seed
|
#let it seed
|
||||||
log.debug('%s is seeding with ratio: %s', (item['name'], item['seed_ratio']))
|
log.debug('%s is seeding with ratio: %s', (item['name'], item['seed_ratio']))
|
||||||
|
|
||||||
elif item['status'] == 'failed':
|
elif item['status'] == 'failed':
|
||||||
|
# Set the release to failed
|
||||||
|
fireEvent('release.update_status', rel.id, status = failed_status, single = True)
|
||||||
|
|
||||||
fireEvent('download.remove_failed', item, single = True)
|
fireEvent('download.remove_failed', item, single = True)
|
||||||
rel.status_id = failed_status.get('id')
|
|
||||||
rel.last_edit = int(time.time())
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
if self.conf('next_on_failed'):
|
if self.conf('next_on_failed'):
|
||||||
fireEvent('movie.searcher.try_next_release', movie_id = rel.movie_id)
|
fireEvent('movie.searcher.try_next_release', movie_id = rel.movie_id)
|
||||||
@@ -750,24 +741,23 @@ Remove it if you want it to be renamed (again, or at least let it try again)
|
|||||||
if rel.status_id == seeding_status.get('id'):
|
if rel.status_id == seeding_status.get('id'):
|
||||||
if rel.movie.status_id == done_status.get('id'):
|
if rel.movie.status_id == done_status.get('id'):
|
||||||
# Set the release to done as the movie has already been renamed
|
# Set the release to done as the movie has already been renamed
|
||||||
rel.status_id = downloaded_status.get('id')
|
fireEvent('release.update_status', rel.id, status = downloaded_status, single = True)
|
||||||
rel.last_edit = int(time.time())
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Allow the downloader to clean-up
|
# Allow the downloader to clean-up
|
||||||
item.update({'pause': False, 'scan': False, 'process_complete': True})
|
item.update({'pause': False, 'scan': False, 'process_complete': True})
|
||||||
scan_items.append(item)
|
scan_items.append(item)
|
||||||
else:
|
else:
|
||||||
# Set the release to snatched so that the renamer can process the release as if it was never seeding
|
# Set the release to snatched so that the renamer can process the release as if it was never seeding
|
||||||
rel.status_id = snatched_status.get('id')
|
fireEvent('release.update_status', rel.id, status = snatched_status, single = True)
|
||||||
rel.last_edit = int(time.time())
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Scan and Allow the downloader to clean-up
|
# Scan and Allow the downloader to clean-up
|
||||||
item.update({'pause': False, 'scan': True, 'process_complete': True})
|
item.update({'pause': False, 'scan': True, 'process_complete': True})
|
||||||
scan_items.append(item)
|
scan_items.append(item)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
# Set the release to snatched if it was missing before
|
||||||
|
fireEvent('release.update_status', rel.id, status = snatched_status, single = True)
|
||||||
|
|
||||||
# Remove the downloading tag
|
# Remove the downloading tag
|
||||||
self.untagDir(item['folder'], 'downloading')
|
self.untagDir(item['folder'], 'downloading')
|
||||||
|
|
||||||
@@ -783,6 +773,14 @@ Remove it if you want it to be renamed (again, or at least let it try again)
|
|||||||
if not found:
|
if not found:
|
||||||
log.info('%s not found in downloaders', nzbname)
|
log.info('%s not found in downloaders', nzbname)
|
||||||
|
|
||||||
|
#Check status if already missing and for how long, if > 1 week, set to ignored else to missing
|
||||||
|
if rel.status_id == missing_status.get('id'):
|
||||||
|
if rel.last_edit < int(time.time()) - 7 * 24 * 60 * 60:
|
||||||
|
fireEvent('release.update_status', rel.id, status = ignored_status, single = True)
|
||||||
|
else:
|
||||||
|
# Set the release to missing
|
||||||
|
fireEvent('release.update_status', rel.id, status = missing_status, single = True)
|
||||||
|
|
||||||
except:
|
except:
|
||||||
log.error('Failed checking for release in downloader: %s', traceback.format_exc())
|
log.error('Failed checking for release in downloader: %s', traceback.format_exc())
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ class StatusPlugin(Plugin):
|
|||||||
'available': 'Available',
|
'available': 'Available',
|
||||||
'suggest': 'Suggest',
|
'suggest': 'Suggest',
|
||||||
'seeding': 'Seeding',
|
'seeding': 'Seeding',
|
||||||
|
'missing': 'Missing',
|
||||||
}
|
}
|
||||||
status_cached = {}
|
status_cached = {}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user