def media_resources(self): PREFIX = 'jr://file/' # you have to call remove_unused_mappings # before iterating through multimedia_map self.app.remove_unused_mappings() if self.app.multimedia_map is None: self.app.multimedia_map = {} filter_multimedia = self.app.media_language_map and self.build_profile if filter_multimedia: media_list = [] for lang in self.build_profile.langs: media_list += self.app.media_language_map[lang].media_refs requested_media = set(media_list) for path, m in sorted(list(self.app.multimedia_map.items()), key=lambda item: item[0]): if filter_multimedia and m.form_media and path not in requested_media: continue unchanged_path = path if path.startswith(PREFIX): path = path[len(PREFIX):] else: raise MediaResourceError('%s does not start with %s' % (path, PREFIX)) path, name = split_path(path) # CommCare assumes jr://media/, # which is an alias to jr://file/commcare/media/ # so we need to replace 'jr://file/' with '../../' # (this is a hack) install_path = '../../{}'.format(path) local_path = './{}/{}'.format(path, name) if not getattr(m, 'unique_id', None): # lazy migration for adding unique_id to map_item m.unique_id = HQMediaMapItem.gen_unique_id( m.multimedia_id, unchanged_path) descriptor = None if self.app.build_version and self.app.build_version >= LooseVersion( '2.9'): type_mapping = { "CommCareImage": "Image", "CommCareAudio": "Audio", "CommCareVideo": "Video", "CommCareMultimedia": "Text" } descriptor = "{filetype} File: {name}".format( filetype=type_mapping.get(m.media_type, "Media"), name=name) yield MediaResource( id=id_strings.media_resource(m.unique_id, name), path=install_path, version=m.version, descriptor=descriptor, local=(local_path if self.app.enable_local_resource else None), remote=self.app.url_base + reverse( 'hqmedia_download', args=[m.media_type, m.multimedia_id]) + six.moves.urllib.parse.quote(name.encode('utf-8')) if name else name)
def media_resources(self): PREFIX = 'jr://file/' multimedia_map = self.app.multimedia_map_for_build( build_profile=self.build_profile, remove_unused=True) lazy_load_preference = self.app.profile.get( 'properties', {}).get('lazy-load-video-files') for path, m in sorted(list(multimedia_map.items()), key=lambda item: item[0]): unchanged_path = path if path.startswith(PREFIX): path = path[len(PREFIX):] else: raise MediaResourceError('%s does not start with %s' % (path, PREFIX)) path, name = split_path(path) # CommCare assumes jr://media/, # which is an alias to jr://file/commcare/media/ # so we need to replace 'jr://file/' with '../../' # (this is a hack) install_path = '../../{}'.format(path) local_path = './{}/{}'.format(path, name) load_lazily = (lazy_load_preference == 'true' and m.media_type == "CommCareVideo") if not getattr(m, 'unique_id', None): # lazy migration for adding unique_id to map_item m.unique_id = HQMediaMapItem.gen_unique_id( m.multimedia_id, unchanged_path) descriptor = None if self.app.build_version and self.app.build_version >= LooseVersion( '2.9'): type_mapping = { "CommCareImage": "Image", "CommCareAudio": "Audio", "CommCareVideo": "Video", "CommCareMultimedia": "Text" } descriptor = "{filetype} File: {name}".format( filetype=type_mapping.get(m.media_type, "Media"), name=name) yield MediaResource( id=id_strings.media_resource(m.unique_id, name), path=install_path, version=m.version, descriptor=descriptor, lazy=load_lazily, local=(local_path if self.app.enable_local_resource else None), remote=self.app.url_base + reverse( 'hqmedia_download', args=[m.media_type, m.multimedia_id]) + six.moves.urllib.parse.quote(name.encode('utf-8')) if name else name)