def _imageWorker(self, collection, info): acceptable_extensions = set(['.jpg', '.gif', '.jpeg', '.bmp', '.png', '.tif', '.tiff', '.wbmp', '.jng', '.svg']) root, ext = os.path.splitext(info.fname) toRemove = [ info.fpath ] try: if ext not in acceptable_extensions: raise TypeError('unknown extension') id = mongo_util.newId() img = Image.open(file(info.fpath, 'rb')) w, h = img.size opath = os.path.join(MediaRoot, 'Image', id[-2:], id + ext) upath = os.path.join(MediaURL, 'Image', id + ext) dirname = os.path.dirname(opath) if not os.path.exists(dirname): os.makedirs(dirname) shutil.move(info.fpath, opath) except Exception: return (False, traceback.format_exc(), None) finally: for f in toRemove: try: os.remove(f) except: pass item = {} item['width'] = w item['height'] = h item['originalName'] = sanitize(info.fname) item['URL'] = sanitize(upath) item['tags'] = [ sanitize(tag) for tag in info.tags ] item['title'] = sanitize(info.title) item['description'] = sanitize(info.description) item['creditURL'] = sanitize(info.creditURL) user = self.get_current_user() item['uploadedBy'] = user['email'] item['uploadedOn'] = datetime.now().isoformat() item['_id'] = id collection.insert(item, safe=True) return (True, item, 'Image')
collection = self.mongo_conn[db_name][collection_name] try: s = self.request.body s = s.replace('"$ref":', '"_ref":') # hide $ref item = json.loads(s, object_hook=pymongo.json_util.object_hook) except ValueError, e: raise HTTPError(400, unicode(e)); # validate the schema self.validateSchema(db_name, collection_name, item) # sanitize try: sanitize(item) except ValueError: raise HTTPError(400, 'HTML field parse failed') # add meta items outside schema id = mongo_util.newId() item['_id'] = id item[access.OwnerKey] = self.getUserId() collection.insert(item, safe=True) # this path should get encoded only one place, fix this self.set_header('Location', '/data/%s-%s/%s/%s' % (mode, db_name, collection_name, id)) s = json.dumps(item, default=pymongo.json_util.default) s = s.replace('"_ref":', '"$ref":') # restore $ref self.set_header('Content-Length', len(s)) self.set_header('Content-Type', 'text/javascript')
def _audioWorker(self, collection, info): root, ext = os.path.splitext(info.fname) toRemove = [ info.fpath ] if not ext: return (False, 'bad extension', None) id = mongo_util.newId() try: opath = os.path.join(MediaRoot, 'Audio', id[-2:], id) upath = os.path.join(MediaURL, 'Audio', id) dirname = os.path.dirname(opath) if not os.path.exists(dirname): os.makedirs(dirname) if info.ftype == 'audio/midi': # check the magic number to try to assure it is midi since timidity doesn't seem to error ms = magic.open(magic.MAGIC_NONE) ms.load() if not re.search(r'\smidi\s', ms.file(info.fpath), re.I): raise TypeError('not midi') tmp = info.fpath + '.wav' toRemove.append(tmp) r1 = subprocess.call([TIMIDITYPATH, '-Ow', '-idqq', info.fpath, '-o', tmp]) if r1: raise RuntimeError('midi decode failed') elif ext != '.wav': tmp = info.fpath + '.wav' r1 = subprocess.call([SOXPATH, '-t', ext, info.fpath, tmp]) toRemove.append(tmp) if r1: raise RuntimeError('wav decode failed') else: tmp = info.fpath # at this point we should have a wav file in tmp r1 = subprocess.call([SOXPATH, '-t', '.wav', tmp, opath + '.mp3', 'rate', '22050', 'norm']) r2 = subprocess.call([SOXPATH, '-t', '.wav', tmp, opath + '.ogg', 'rate', '22050', 'norm']) if r1 or r2: raise RuntimeError('encoding failed') # get the duration mf = mad.MadFile(opath + '.mp3') duration = mf.total_time() / 1000.0 except Exception: return (False, traceback.format_exc(), None) finally: for f in toRemove: try: os.remove(f) except: pass item = {} item['originalName'] = sanitize(info.fname) item['URL'] = upath item['tags'] = [ sanitize(tag) for tag in info.tags ] item['title'] = sanitize(info.title) item['description'] = sanitize(info.description) item['creditURL'] = sanitize(info.creditURL) user = self.get_current_user() item['uploadedBy'] = user['email'] item['uploadedOn'] = datetime.now().isoformat() item['duration'] = duration item['_id'] = id collection.insert(item, safe=True) return (True, item, 'Audio')