access callback, only one frame/video extraction thread. make sure all frames are extracted before returning them

This commit is contained in:
j 2010-09-08 19:16:07 +02:00
parent 6bdeb5ef85
commit 0af4304e88
4 changed files with 39 additions and 14 deletions

View file

@ -90,6 +90,7 @@ def hash_prefix(h):
return [h[:2], h[2:4], h[4:6], h[6:]]
def run_command(cmd, timeout=25):
#print cmd
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
while timeout > 0:
time.sleep(0.2)
@ -152,6 +153,7 @@ def extract_frame(video, target, position):
framedir = tempfile.mkdtemp()
os.chdir(framedir)
cmd = ['mplayer', '-noautosub', video, '-ss', str(position), '-frames', '2', '-vo', 'png:z=9', '-ao', 'null']
print cmd
r = run_command(cmd)
images = glob('%s/*.png' % framedir)
if images:
@ -292,10 +294,10 @@ class Database(object):
def __init__(self, db_conn):
self.extract = Queue.Queue()
for i in range(2):
t = ExtractThread(self)
t.setDaemon(True)
t.start()
#for i in range(2):
t = ExtractThread(self)
t.setDaemon(True)
t.start()
self.db_conn = db_conn
conn, c = self.conn()
@ -459,7 +461,6 @@ class Database(object):
self.derivative(oshash, frame_name, STATUS_FAILED)
elif name.endswith('.webm'):
profile = name[:-5]
print 'now lets go, are we having fun?'
self.derivative(oshash, name, STATUS_EXTRACTING)
if extract_video(f['path'], derivative['path'], profile, f['info']):
self.derivative(oshash, name, STATUS_AVAILABLE)
@ -732,21 +733,30 @@ class OxControl(Resource):
derivative = self.db.derivative(oshash, name)
if derivative['status'] == STATUS_FAILED and retry:
derivative = self.db.derivative(oshash, name, STATUS_NEW)
response['status'] = {
_STATUS = {
STATUS_NEW: 'extracting',
STATUS_EXTRACTING: 'extracting',
STATUS_AVAILABLE: 'available',
STATUS_FAILED: 'failed',
}.get(derivative['status'], 'extracting')
}
response['status'] = _STATUS.get(derivative['status'], 'extracting')
if derivative['status'] == STATUS_NEW:
self.db.extract.put((oshash, name))
if derivative['status'] == STATUS_EXTRACTING:
print "queue", self.db.extract.qsize()
response['progress'] = enc_status.get(oshash, 0)
files = [f['path'] for f in self.db.derivatives(oshash)]
if media == 'frames':
response['frames'] = filter(lambda f: f.endswith('.png'), files)
status = derivative['status']
for f in self.db.derivatives(oshash):
if f['path'].endswith('.png'):
status = min(status, f['status'])
if status == derivative['status']:
response['frames'] = filter(lambda f: f.endswith('.png'), files)
else:
response['status'] = _STATUS.get(status, 'extracting')
else:
response['video'] = filter(lambda f: f.endswith(media), files)
if response['video']: response['video'] = response['video'][0]

View file

@ -129,8 +129,7 @@ OxFF.prototype = {
//nsIOxFF
version: "bzr",
access: function(request) {
if (typeof(request) == 'undefined') request = false;
access: function(callback) {
var _this = this;
var conn = oxff.getDB();
@ -144,22 +143,28 @@ OxFF.prototype = {
}
q.finalize();
if (request && !this._access) {
if (callback && !this._access) {
var windowMediator = Cc["@mozilla.org/appshell/window-mediator;1"].getService(Ci.nsIWindowMediator);
var nsWindow = windowMediator.getMostRecentWindow("navigator:browser");
var box = nsWindow.gBrowser.getNotificationBox();
var buttons = [{
label : "Allow",
accessKey : "A",
callback : function() { _this.permitAccess(); }
callback : function() { _this.permitAccess();
if(callback) callback.callback(true);
}
},
{
label : "Deny",
accessKey : "D",
callback : function() { _this.denyAccess(); }
callback : function() { _this.denyAccess();
if(callback) callback.callback(false);
}
}];
box.appendNotification("Do you wnat to allow "+_this._site+" to manage archvies on your computer",
'oxff_permission' , null , box.PRIORITY_INFO_MEDIUM , buttons);
} else if(callback) {
callback.callback(this._access);
}
return this._access;
},
@ -225,6 +230,7 @@ OxFF.prototype = {
var formData = options.data;
else
var formData = {};
var url = options.url;
if (callback)

Binary file not shown.

View file

@ -9,6 +9,15 @@ interface oxICallback : nsISupports
void callback(in AString result);
};
[function, scriptable, uuid(70015be1-2620-4682-ba3c-8024e7cb41ac)]
interface oxIBooleanCallback : nsISupports
{
/**
* @param result boolean
*/
void callback(in boolean result);
};
[scriptable, uuid(333280ed-2620-46ed-916d-b9c29e84d9ba)]
interface nsIOxFF : nsISupports
@ -16,7 +25,7 @@ interface nsIOxFF : nsISupports
readonly attribute string version;
boolean login(in AString user);
boolean access([optional] in boolean request);
boolean access([optional] in oxIBooleanCallback callback);
boolean logout();
string volumes(in oxICallback callback);