def add_file(cls, file): '''Add a file or path. ''' types = list(set(TYPES_DEF.values())) for file_ in files(file, types=types): info = file_.get_file_info() name = info.get('display_name') if not name: continue doc = { 'name': name, 'type': file_.type, 'info': info, } res = cls.update({'$or': [ {'files': file_.file}, {'name': name}, ]}, { '$set': doc, '$addToSet': {'files': file_.file}, }, safe=True) if not res['updatedExisting']: doc['files'] = [file_.file] doc['created'] = datetime.utcnow() doc['date'] = get_mtime(file_.file) cls.insert(doc, safe=True)
def download(self, url, dst, temp_dir): files_dst = [] with mkdtemp(temp_dir) as temp_dst: file = self._download(url, temp_dst) if not file: return dir = unpack_download(file) for file_ in files(dir, types='subtitles'): file_dst = move_file(clean_file(file_.file), dst) if file_dst: files_dst.append(file_dst) return files_dst
def download(self, url, dst, temp_dir): files_dst = [] with mkdtemp(temp_dir) as temp_dst: res = download_file(url, temp_dst, temp_dst) if not res: return if not self._check_file(res[0]): return dir = unpack_download(res[0]) for file_ in files(dir, types='subtitles'): file_dst = move_file(clean_file(file_.file), dst) if file_dst: files_dst.append(file_dst) return files_dst
def get_downloads(path_root): '''Clean and get download sub directories. :return: directories list ''' paths = [] for path in list(media.iter_files(path_root, incl_files=False, incl_dirs=True)) + [path_root]: if media.get_type(path) == 'audio': album = {} extra = [] for file in media.files(path, recursive=False): # Get album files if file.type == 'audio' and file.ext.lower() not in ('.m3u',): album[file.file] = file.get_file_info() # Get extra files elif file.type == 'video' or (file.type == 'image' \ and media.get_size(file.file) > SIZE_ALBUM_IMAGE_MIN): extra.append(file.file) else: media.remove_file(file.file) path_dst = path if album: stat = {} for info in album.values(): def set_stat(key, force=False): stat.setdefault(key, []) val = info.get(key) if val and (force or val not in stat[key]): stat[key].append(val) set_stat('title', True) for key in ('artist', 'album', 'date', 'track_number'): set_stat(key) if len(stat['title']) == len(stat['track_number']) == len(album): # Rename tracks files for file, info in album.items(): track_name = '%02d-%s-%s' % (info.get('track_number', 0), info['artist'], info['title']) track_name = re.sub(r'\s+', '_', track_name).lower() file_dst = os.path.join(path, track_name + os.path.splitext(file)[1]) media.rename_file(file, file_dst) # Get album directory name if len(stat['artist']) == len(stat['album']) == 1: date_str = '-%s' % stat['date'][0] if len(stat['date']) == 1 else '' album_name = '%s-%s%s' % (stat['artist'][0].capitalize(), stat['album'][0].capitalize(), date_str) album_name = re.sub(r'\s+', '_', album_name) # Rename extra files using the album name for file in extra: filename_extra = os.path.basename(file) if not filename_extra.startswith('00-'): file_dst = os.path.join(path, '00-%s-%s' % (album_name.lower(), filename_extra.lower())) media.rename_file(file, file_dst) # Rename album directory path_dst = media.rename_file(path, os.path.join(os.path.dirname(path_root), album_name)) paths.append(path_dst) if os.path.exists(path_root) and path_root not in paths: paths.append(path_root) return paths