def analyze_file(self, an_uri): """Returns a FileDescription :param an_uri: the URI pointing to the file to be analyzed :rtype: :py:class:`damn_at.FileDescription` :raises: AnalyzerException, AnalyzerFileException, AnalyzerUnknownTypeException """ if not is_existing_file(an_uri): raise AnalyzerFileException('E: Analyzer: No such file "%s"!' % (an_uri)) mimetype = mimetypes.guess_type(an_uri, False)[0] if mimetype in self.analyzers: try: file_descr = self.analyzers[mimetype].plugin_object.analyze( an_uri) file_descr.mimetype = mimetype self._file_metadata(an_uri, file_descr) return file_descr except Exception as ex: import traceback traceback.print_exc() raise AnalyzerException( "E: Failed to analyze %s because of %s" % (an_uri, str(ex))) else: raise AnalyzerUnknownTypeException( "E: Analyzer: No analyzer for %s (file: %s)" % (mimetype, an_uri))
def analyze(self, an_uri): fileid = FileId(filename=os.path.abspath(an_uri)) file_descr = FileDescription(file=fileid) file_descr.assets = [] text_mimetype = mimetypes.guess_type(an_uri)[0] asset_descr = AssetDescription(asset=AssetId( subname='content', mimetype=text_mimetype, file=fileid )) num_lines = sum(1 for line in open(an_uri)) with magic.Magic(flags=magic.MAGIC_MIME_ENCODING) as mm: charset = mm.id_filename(an_uri) asset_descr.metadata = {} asset_descr.metadata['lines'] = MetaDataValue( type=MetaDataType.INT, int_value=num_lines ) asset_descr.metadata['charset'] = MetaDataValue( type=MetaDataType.STRING, string_value=charset ) file_descr.assets.append(asset_descr) return file_descr
def analyze(self, an_uri): fileid = FileId(filename=os.path.abspath(an_uri)) file_descr = FileDescription(file=fileid) file_descr.assets = [] image_mimetype = mimetypes.guess_type(an_uri)[0] asset_descr = AssetDescription(asset=AssetId( subname='main layer', mimetype=image_mimetype, file=fileid)) try: pro = subprocess.Popen(['exiftool', an_uri], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = pro.communicate() if pro.returncode != 0: msg = 'ImageAnalyzer failed %s with error code %d!:\n%s' % ( an_uri, pro.returncode, str(err)) LOG.error(msg) raise AnalyzerException(msg) except OSError as e: msg = 'ImageAnalyzer failed %s:\n%s' % (an_uri, e) LOG.error(msg) raise e(msg) meta = {} flag = 0 lines = str(out).strip().split('\n') for line in lines: line = line.split(':', 1) if len(line) == 1: line = line[0].split('=') line = [l.strip() for l in line] if line[0] == 'MIME Type': flag = 1 if flag == 1 and line[0] not in ['MIME Type', 'Image Size']: meta[line[0].lower().replace(' ', '_')] = line[1] from damn_at.analyzers.image import metadata extractor_map = { 'image/png': metadata.MetaDataPNG, 'image/jpeg': metadata.MetaDataJPG, 'image/x-ms-bmp': metadata.MetaDataBMP, 'image/x-photoshop': metadata.MetaDataPSD, 'application/x-xcf': metadata.MetaDataXCF, } if image_mimetype in extractor_map: asset_descr.metadata = extractor_map[image_mimetype].extract(meta) else: asset_descr.metadata = {} for key, value in meta.items(): if key not in asset_descr.metadata: asset_descr.metadata['exif-' + key] = MetaDataValue( type=MetaDataType.STRING, string_value=value) file_descr.assets.append(asset_descr) return file_descr
def analyze(self, an_uri): fileid = FileId(filename=os.path.abspath(an_uri)) file_descr = FileDescription(file=fileid) file_descr.assets = [] image_mimetype = mimetypes.guess_type(an_uri)[0] asset_descr = AssetDescription(asset=AssetId( subname='main layer', mimetype=image_mimetype, file=fileid )) im = Image.open(an_uri) meta = {'format': im.format, 'size': im.size, 'mode': im.mode} meta.update(im.info) from damn_at.analyzers.image.metadata import MetaDataTGA asset_descr.metadata = MetaDataTGA.extract(meta) file_descr.assets.append(asset_descr) return file_descr
def get_assimp_types(): """Extract all possible formats and store their mime types""" # TODO: not exactly reliable, a lot of unknown mimetypes # for those extensions :/ try: pro = subprocess.Popen( ['assimp', 'listext'], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) out, err = pro.communicate() if pro.returncode != 0: LOG.debug("'assimp listext' failed with error code %d! " % pro.returncode, out, err ) return [] except OSError as oserror: LOG.debug("'assimp listext' failed! %s", oserror) return [] extensions = out.split(';') mimes = [] for ext in extensions: mime = mimetypes.guess_type('file.' + ext, False)[0] LOG.info('Mimetype Info:\n\tExtension: %s\n\tMime: %s', ext, mime) mimes.append(mime) return mimes
def get_assimp_types(): """ Extract all possible formats and store their mime types """ # TODO: not exactly reliable, a lot of unknown mimetypes # for those extensions :/ try: pro = subprocess.Popen( ['assimp', 'listext'], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) out, err = pro.communicate() if pro.returncode != 0: LOG.debug("'assimp listext' failed with error code %d!\n%s\n%s" % ( pro.returncode, out, err )) return [] except OSError as oserror: LOG.debug("'assimp listext' failed! %s", oserror) return [] extensions = out.split(';') mimes = [] for ext in extensions: mime = mimetypes.guess_type('file.' + ext, False)[0] LOG.info('Mimetype Info:\n\tExtension: %s\n\tMime: %s' % (ext, mime)) mimes.append(mime) return mimes
def analyze(self, an_uri): fileid = FileId(filename = os.path.abspath(an_uri)) file_descr = FileDescription(file = fileid) file_descr.assets = [] image_mimetype = mimetypes.guess_type(an_uri)[0] asset_descr = AssetDescription(asset = AssetId(subname = 'main layer', mimetype = image_mimetype, file = fileid)) try: pro = subprocess.Popen(['exiftool',an_uri], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = pro.communicate() if pro.returncode != 0: print("E: ImageAnalyzer failed %s with error code %d! " %(an_uri, pro.returncode), out, err) raise AnalyzerException("ImageAnalyzer failed %s with error code %d! "%(an_uri, pro.returncode)) except OSError as e: print("E: ImageAnalyzer failed %s (%s)" %(an_uri, e)) raise e meta = {} flag = 0 lines = out.strip().split('\n') for line in lines: line = line.split(':', 1) if len(line) == 1: line = line[0].split('=') line = [l.strip() for l in line] if line[0] == 'MIME Type' : flag = 1 if flag == 1 and line[0] not in ['MIME Type', 'Image Size']: meta[line[0].lower().replace(' ','_')] = line[1] from damn_at.analyzers.image import metadata extractor_mapping = {'image/png' : metadata.MetaDataPNG, 'image/jpeg' : metadata.MetaDataJPG, 'image/x-ms-bmp' : metadata.MetaDataBMP, 'image/x-photoshop' : metadata.MetaDataPSD, 'application/x-xcf' : metadata.MetaDataXCF,} if image_mimetype in extractor_mapping: asset_descr.metadata = extractor_mapping[image_mimetype].extract(meta) else: asset_descr.metadata = {} for key, value in meta.items(): if key not in asset_descr.metadata: asset_descr.metadata['exif-'+key] = MetaDataValue(type=MetaDataType.STRING, string_value = value) file_descr.assets.append(asset_descr) return file_descr
def test_analyzer(self): keys = ['duration', 'fingerprint_uuid', 'fingerprint'] analyzer = acoustid_analyzer.SoundAnalyzer() uri = os.path.join(os.path.dirname(__file__), '../../peragro-test-files/audio') for root, dirs, files in os.walk(uri): for file_name in files: path = os.path.join(root, file_name) mime = mimetypes.guess_type(path, False)[0] if mime.startswith('audio/'): file_descr = analyzer.analyze(path) if file_descr: for asset in file_descr.assets: for key, value in asset.metadata.items(): assert key in keys, \ "Unknown key(feature):%s detected" % key else: assert False, \ "AcoustID analyzer failed with some error"
def get_assimp_types(): """ Extract all possible formats and store their mime types """ try: pro = subprocess.Popen(['assimp', 'listext'], stdout=subprocess.PIPE,stderr=subprocess.PIPE) out, err = pro.communicate() if pro.returncode != 0: logger.debug("'assimp listext' failed with error code %d! "%(pro.returncode), out, err) return [] except OSError as oserror: logger.debug("'assimp listext' failed! %s", oserror) return [] extensions = out.split(';') mimes = [] for ext in extensions: mime = mimetypes.guess_type('file.'+ext, False)[0] print ext, mime mimes.append(mime) return mimes
def analyze_file(self, an_uri): """Returns a FileDescription :param an_uri: the URI pointing to the file to be analyzed :rtype: :py:class:`damn_at.FileDescription` :raises: AnalyzerException, AnalyzerFileException, AnalyzerUnknownTypeException """ if not is_existing_file(an_uri): raise AnalyzerFileException('E: Analyzer: No such file "%s"!' % (an_uri)) mimetype = mimetypes.guess_type(an_uri, False)[0] if mimetype in self.analyzers: try: file_descr = self.analyzers[mimetype].plugin_object.analyze(an_uri) file_descr.mimetype = mimetype self._file_metadata(an_uri, file_descr) return file_descr except Exception as ex: import traceback traceback.print_exc() raise AnalyzerException("E: Failed to analyze %s because of %s" % (an_uri, str(ex))) else: raise AnalyzerUnknownTypeException("E: Analyzer: No analyzer for %s (file: %s)" % (mimetype, an_uri))
def test_analyzer(self): keys = ['bpm', 'beats_count', 'chord', 'key', 'average_loudness', 'lossless', 'mood_party', 'genre_electronic', 'voice_instrumental', 'mood_aggressive', 'ismir04_rhythm', 'mood_electronic', 'timbre', 'danceability', 'genre_rosamerica', 'mood_relaxed', 'mood_acoustic', 'moods_mirex', 'mood_happy', 'genre_tzanetakis', 'genre_dortmund', 'mood_sad', 'gender', 'tonal_atonal'] analyzer = feature_extraction.SoundAnalyzer() uri = os.path.join(os.path.dirname(__file__), '../../peragro-test-files/audio') for root, dirs, files in os.walk(uri): for file_name in files: path = os.path.join(root, file_name) mime = mimetypes.guess_type(path, False)[0] if mime.startswith('audio/'): file_descr = analyzer.analyze(path) if file_descr: for asset in file_descr.assets: for key, value in asset.metadata.items(): assert key in keys, \ "Unknown key(feature):%s detected" % key else: assert False, \ "Feature extractor failed with some error"
def project_page(request, author_name, project_slug): user = request.user user_profile = Profile.objects.get(pk=user) user_membership = Membership.objects.filter(member=user) project_list=[] for x in user_membership: project_list.append(x.project) author_ob = User.objects.get(username = author_name) project_ob = Project.objects.filter(author = author_ob, slug = project_slug)[0] members_list = project_ob.members.all() project_media = MediaUpload.objects.filter(project=project_ob) roles = Role.objects.filter(project = project_ob) task_list = TaskUI.objects.filter(project=project_ob) relation_list = AssignedResource_Relation.objects.filter(project = project_ob) priority_list = Priority.objects.filter(project=project_ob) type_list = TaskType.objects.filter(project=project_ob) profile_list = [] for x in members_list: p = Profile.objects.get(pk = x) profile_list.append(p) context={ 'project_ob':project_ob, 'profile_list':profile_list, 'user_profile' : user_profile, 'user' : user, 'user_project_list':project_list, 'project_media':project_media, 'roles':roles, 'members_list':members_list, 'task_list':task_list, 'relation_list':relation_list, 'type_list':type_list, 'priority_list':priority_list, } if request.method == 'POST': # for x in if request.POST.get('update-role'): role = Role.objects.get(id = int(request.POST['id'])) role.name = request.POST['name'] role.save() return HttpResponseRedirect('.') elif request.POST.get('delete-role'): role = Role.objects.get(id = int(request.POST['id'])) role.delete() return HttpResponseRedirect('.') elif request.POST.get('new-role'): role = Role() role.name = request.POST['name'] role.project = project_ob role.save() return HttpResponseRedirect('.') elif request.POST.get('update-rel'): rel = AssignedResource_Relation.objects.get(id = int(request.POST['id'])) rel.task = TaskUI.objects.get(id = int(request.POST['task'])) rel.user = User.objects.get(id = int(request.POST['user'])) rel.role = Role.objects.get(id = int(request.POST['role'])) rel.effort = request.POST['effort'] rel.save() return HttpResponseRedirect('.') elif request.POST.get('delete-rel'): rel = AssignedResource_Relation.objects.get(id = int(request.POST['id'])) rel.delete() return HttpResponseRedirect('.') elif request.POST.get('new-rel'): rel = AssignedResource_Relation.objects.get(id = int(request.POST['id'])) rel.task = TaskUI.objects.get(id = int(request.POST['task'])) rel.user = User.objects.get(id = int(request.POST['user'])) rel.role = Role.objects.get(id = int(request.POST['role'])) rel.effort = request.POST['effort'] rel.project = project_ob rel.save() return HttpResponseRedirect('.') elif request.POST.get('update-task'): task = TaskUI.objects.get(id = int(request.POST['id'])) task.name = request.POST['name'] task.short_name = request.POST['short-name'] task.level = request.POST['level'] task.summary = request.POST['summary'] task.description = request.POST['description'] task.status = request.POST['status'] task.priority = Priority.objects.get(id = int(request.POST['priority'])) task.type = TaskType.objects.get(id = int(request.POST['type'])) if request.POST.get('start-is-milestone'): task.start_is_milestone = True else: pass if request.POST.get('end-is-milestone'): task.end_is_milestone = True else: pass if request.POST.get('has-child'): task.start_is_milestone = True else: pass if request.POST.get('can-write'): task.start_is_milestone = True else: pass task.depends = request.POST['depends'] task.save() return HttpResponseRedirect('.') elif request.POST.get('del-task'): task = TaskUI.objects.get(id = int(request.POST['id'])) task.delete() return HttpResponseRedirect('.') elif request.POST.get('update-task'): task = TaskUI.objects.get(id = int(request.POST['id'])) task.name = request.POST['name'] task.short_name = request.POST['short-name'] task.level = request.POST['level'] task.summary = request.POST['summary'] task.description = request.POST['description'] task.status = request.POST['status'] task.priority = Priority.objects.get(id = int(request.POST['priority'])) task.type = TaskType.objects.get(id = int(request.POST['type'])) if request.POST.get('start-is-milestone'): task.start_is_milestone = True else: pass if request.POST.get('end-is-milestone'): task.end_is_milestone = True else: pass if request.POST.get('has-child'): task.start_is_milestone = True else: pass if request.POST.get('can-write'): task.start_is_milestone = True else: pass task.depends = request.POST['depends'] task.save() return HttpResponseRedirect('.') elif request.POST.get('del-task'): task = TaskUI.objects.get(id = int(request.POST['id'])) task.delete() return HttpResponseRedirect('.') elif request.POST.get('new-task'): task = TaskUI() task.name = request.POST['name'] task.short_name = request.POST['short-name'] task.project = request.POST['project'] task.author = request.POST['author'] task.level = request.POST['level'] task.summary = request.POST['summary'] task.description = request.POST['description'] task.status = request.POST['status'] task.priority = Priority.objects.get(id = int(request.POST['priority'])) task.type = TaskType.objects.get(id = int(request.POST['type'])) task.project = project_ob task.author = request.user if request.POST.get('start-is-milestone'): task.start_is_milestone = True else: pass if request.POST.get('end-is-milestone'): task.end_is_milestone = True else: pass if request.POST.get('has-child'): task.start_is_milestone = True else: pass if request.POST.get('can-write'): task.start_is_milestone = True else: pass task.depends = request.POST['depends'] task.save() return HttpResponseRedirect('.') # elif request.POST.get() # for key in request.POST.iterkeys(): # v # if key == 'new_role': # if request.POST[key] != "": # role = Role() # role.name = request.POST[key] # role.project = project_ob # role.save() # else: # pass # elif key == 'save_role': # pass # else: # role.name = request.POST[key] # role.save() # elif request.POST.get('save_relation'): # flag = 0 # for key in request.POST.iterkeys(): # if key in ['new_task','new_role','new_effort','new_user']: # if flag == 0: # if request.POST.get('add_new_relation'): # flag = 1 # rel = AssignedResource_Relation() # rel.project = project_ob # rel.task = TaskUI.objects.get(id = int(request.POST['new_task'])) # rel.user = User.objects.get(id = int(request.POST['new_user'])) # rel.role = Role.objects.get(id = int(request.POST['new_role'])) # rel.effort = request.POST['new_effort'] # action.send(rel.user, verb='assigned', action_object=rel.role, target=rel.task) # rel.save() # else: # pass # elif key == 'save_relaltion': # pass # else: # for rel in relation_list: # if str(rel.id) == key: # rel.task = TaskUI.objects.get(id = int(request.POST[key])) # rel.role = Role.objects.get(id = int(request.POST[key+'_role'])) # rel.user = User.objects.get(id = int(request.POST[key+'_user'])) # rel.effort = int(request.POST[key+'_effort']) # rel.save() # if request.POST.get('save_reelaltion'): # for x in roles: # try: # role = Role.objects.get(id = int(request.POST[x.id])) # role.name = # role. else: media_ob = MediaUpload.objects.create(project=project_ob) media_ob.media = request.FILES['file'] # media_ob.project = project_ob media_ob.save() if media_ob.media.url: analyzer = Analyzer() path = os.path.join(MEDIA_ROOT, media_ob.media.name) media_ob.mimetype = mimetypes.guess_type(path, False)[0] file_descr = analyzer.analyze_file(path) print(file_descr) file_descr.hash = calculate_hash_for_file(path) media_ob.file_description = file_descr media_ob.hash = file_descr.hash media_ob.save() action.send(request.user, verb='uploaded', action_object=media_ob, target=project_ob) if 'video' in media_ob.mimetype: transcdoer_path = MEDIA_ROOT transcoder = Transcoder(transcdoer_path) asset_name = get_asset_names_in_file_descr(file_descr) asset_name = asset_name[0] asset_id = find_asset_ids_in_file_descr(file_descr, asset_name) asset_id = asset_id[0] target_mimetype = transcoder.get_target_mimetype(media_ob.mimetype, 'image/jpeg') height = file_descr.assets[0].metadata['height'].int_value width = file_descr.assets[0].metadata['width'].int_value print('height', height) print('height', width) duration = file_descr.assets[0].metadata['duration'].string_value # new_width = 200 # new_height = 200*(height/width) try: time = duration.split(':') time = eval(time[0])*3600 + eval(time[1])*60 + eval(time[2]) except: time = duration.split('.') time = eval(time[0]) if time < 10: options = {'second':-1,'size':(width, height)} else: options = {'second':5,'size':(width, height)} get_image = transcoder.transcode(file_descr, asset_id, target_mimetype, **options) media_ob.resource_link = get_image[0] media_ob.save() return HttpResponse('done') else: return render(request, 'project_page.html', context)