def encode(src, variations, res_y): # For every variation in the list call video_encode # print "encoding {0}".format(variations) for v in variations: path = ffmpeg_encode(file_abs_path, v, res_y) # Update size data after encoding # (TODO) update status (non existing now) file_size = os.stat(path).st_size variation = files_collection.find_one(variations[v]) variation['length'] = file_size # print variation file_asset = files_collection.find_and_modify( {'_id': variations[v]}, variation) # rsync the file file (this is async) remote_storage_sync(path)
def process_file(src_file): """Process the file """ files_collection = app.data.driver.db['files'] file_abs_path = os.path.join(app.config['SHARED_DIR'], src_file['name']) src_file['length'] = os.stat(file_abs_path).st_size # Remove properties that do not belong in the collection del src_file['_status'] del src_file['_links'] content_type = src_file['content_type'].split('/') src_file['format'] = content_type[1] mime_type = content_type[0] src_file['path'] = src_file['name'] if mime_type == 'image': from PIL import Image im = Image.open(file_abs_path) res = im.size src_file['width'] = res[0] src_file['height'] = res[1] # Generate previews build_thumbnails(file_id=src_file['_id']) elif mime_type == 'video': pass # Generate variations src_video_data = get_video_data(file_abs_path) variations = { 'mp4': None, 'webm': None } if src_video_data['duration']: src_file['duration'] = src_video_data['duration'] # Properly resize the video according to 720p and 1080p resolutions if src_video_data['res_y'] < 1080: res_y = 720 elif src_video_data['res_y'] >= 1080: res_y = 1080 # Create variations in database for v in variations: root, ext = os.path.splitext(src_file['name']) filename = "{0}-{1}p.{2}".format(root, res_y, v) video_duration = None if src_video_data['duration']: video_duration = src_video_data['duration'] file_object = dict( name=os.path.split(filename)[1], #description="Preview of file {0}".format(file_['name']), user=src_file['user'], parent=src_file['_id'], size="{0}p".format(res_y), duration=video_duration, format=v, width=src_video_data['res_x'], height=src_video_data['res_y'], content_type="video/{0}".format(v), length=0, # Available after encode md5="", # Available after encode filename=os.path.split(filename)[1], backend=src_file['backend'], path=filename) file_object_id = files_collection.save(file_object) # Append the ObjectId to the new list variations[v] = file_object_id def encode(src, variations, res_y): # For every variation in the list call video_encode # print "encoding {0}".format(variations) for v in variations: path = ffmpeg_encode(file_abs_path, v, res_y) # Update size data after encoding # (TODO) update status (non existing now) file_size = os.stat(path).st_size variation = files_collection.find_one(variations[v]) variation['length'] = file_size # print variation file_asset = files_collection.find_and_modify( {'_id': variations[v]}, variation) # rsync the file file (this is async) remote_storage_sync(path) # When all encodes are done, delete source file p = Process(target=encode, args=(file_abs_path, variations, res_y)) p.start() if mime_type != 'video': # Sync the whole subdir sync_path = os.path.split(file_abs_path)[0] else: sync_path = file_abs_path remote_storage_sync(sync_path) files_collection = app.data.driver.db['files'] file_asset = files_collection.find_and_modify( {'_id': src_file['_id']}, src_file)
def process_file(src_file): """Process the file """ files_collection = app.data.driver.db['files'] file_abs_path = os.path.join(app.config['SHARED_DIR'], src_file['name']) src_file['length'] = os.stat(file_abs_path).st_size # Remove properties that do not belong in the collection del src_file['_status'] del src_file['_links'] content_type = src_file['content_type'].split('/') src_file['format'] = content_type[1] mime_type = content_type[0] src_file['path'] = src_file['name'] if mime_type == 'image': from PIL import Image im = Image.open(file_abs_path) res = im.size src_file['width'] = res[0] src_file['height'] = res[1] # Generate previews build_thumbnails(file_id=src_file['_id']) elif mime_type == 'video': pass # Generate variations src_video_data = get_video_data(file_abs_path) variations = {'mp4': None, 'webm': None} if src_video_data['duration']: src_file['duration'] = src_video_data['duration'] # Properly resize the video according to 720p and 1080p resolutions if src_video_data['res_y'] < 1080: res_y = 720 elif src_video_data['res_y'] >= 1080: res_y = 1080 # Create variations in database for v in variations: root, ext = os.path.splitext(src_file['name']) filename = "{0}-{1}p.{2}".format(root, res_y, v) video_duration = None if src_video_data['duration']: video_duration = src_video_data['duration'] file_object = dict( name=os.path.split(filename)[1], #description="Preview of file {0}".format(file_['name']), user=src_file['user'], parent=src_file['_id'], size="{0}p".format(res_y), duration=video_duration, format=v, width=src_video_data['res_x'], height=src_video_data['res_y'], content_type="video/{0}".format(v), length=0, # Available after encode md5="", # Available after encode filename=os.path.split(filename)[1], backend=src_file['backend'], path=filename) file_object_id = files_collection.save(file_object) # Append the ObjectId to the new list variations[v] = file_object_id def encode(src, variations, res_y): # For every variation in the list call video_encode # print "encoding {0}".format(variations) for v in variations: path = ffmpeg_encode(file_abs_path, v, res_y) # Update size data after encoding # (TODO) update status (non existing now) file_size = os.stat(path).st_size variation = files_collection.find_one(variations[v]) variation['length'] = file_size # print variation file_asset = files_collection.find_and_modify( {'_id': variations[v]}, variation) # rsync the file file (this is async) remote_storage_sync(path) # When all encodes are done, delete source file p = Process(target=encode, args=(file_abs_path, variations, res_y)) p.start() if mime_type != 'video': # Sync the whole subdir sync_path = os.path.split(file_abs_path)[0] else: sync_path = file_abs_path remote_storage_sync(sync_path) files_collection = app.data.driver.db['files'] file_asset = files_collection.find_and_modify({'_id': src_file['_id']}, src_file)