def play_dir( api: BaiduPCSApi, remotedir: str, sifters: List[Sifter] = [], recursive: bool = False, from_index: int = 0, player: Player = DEFAULT_PLAYER, player_params: List[str] = [], m3u8: bool = False, quiet: bool = False, shuffle: bool = False, ignore_ext: bool = False, out_cmd: bool = False, local_server: str = "", ): remotepaths = api.list(remotedir) remotepaths = sift(remotepaths, sifters, recursive=recursive) if shuffle: rg = random.Random(time.time()) rg.shuffle(remotepaths) for rp in remotepaths[from_index:]: if rp.is_file: play_file( api, rp.path, player, player_params=player_params, m3u8=m3u8, quiet=quiet, ignore_ext=ignore_ext, out_cmd=out_cmd, local_server=local_server, ) else: # is_dir if recursive: play_dir( api, rp.path, sifters=sifters, recursive=recursive, from_index=from_index, player=player, player_params=player_params, m3u8=m3u8, quiet=quiet, shuffle=shuffle, ignore_ext=ignore_ext, out_cmd=out_cmd, local_server=local_server, )
def download( api: BaiduPCSApi, remotepaths: List[str], localdir: str, sifters: List[Sifter] = [], recursive: bool = False, from_index: int = 0, downloader: Downloader = DEFAULT_DOWNLOADER, downloadparams: DownloadParams = DEFAULT_DOWNLOADPARAMS, out_cmd: bool = False, ): """Download `remotepaths` to the `localdir` Args: `from_index` (int): The start index of downloading entries from EACH remote directory """ remotepaths = sift(remotepaths, sifters) for rp in remotepaths: if not api.exists(rp): print(f"[yellow]WARNING[/yellow]: `{rp}` does not exist.") continue if api.is_file(rp): download_file( api, rp, localdir, downloader=downloader, downloadparams=downloadparams, out_cmd=out_cmd, ) else: _localdir = str(Path(localdir) / os.path.basename(rp)) download_dir( api, rp, _localdir, sifters=sifters, recursive=recursive, from_index=from_index, downloader=downloader, downloadparams=downloadparams, out_cmd=out_cmd, ) if downloader == Downloader.me: MeDownloader._exit_executor() _progress.stop()
def download_dir( api: BaiduPCSApi, remotedir: str, localdir: str, sifters: List[Sifter] = [], recursive: bool = False, from_index: int = 0, downloader: Downloader = DEFAULT_DOWNLOADER, downloadparams=DEFAULT_DOWNLOADPARAMS, out_cmd: bool = False, encrypt_password: bytes = b"", ): remotepaths = api.list(remotedir) remotepaths = sift(remotepaths, sifters, recursive=recursive) for rp in remotepaths[from_index:]: if rp.is_file: download_file( api, rp.path, localdir, downloader, downloadparams=downloadparams, out_cmd=out_cmd, encrypt_password=encrypt_password, ) else: # is_dir if recursive: _localdir = Path(localdir) / os.path.basename(rp.path) download_dir( api, rp.path, str(_localdir), sifters=sifters, recursive=recursive, from_index=from_index, downloader=downloader, downloadparams=downloadparams, out_cmd=out_cmd, encrypt_password=encrypt_password, )
def play_dir( api: BaiduPCSApi, remotedir: str, sifters: List[Sifter] = [], recursive: bool = False, from_index: int = 0, player: Player = DEFAULT_PLAYER, player_params: List[str] = [], m3u8: bool = False, quiet: bool = False, out_cmd: bool = False, ): remotepaths = api.list(remotedir) remotepaths = sift(remotepaths, sifters) for rp in remotepaths[from_index:]: if rp.is_file: play_file( api, rp.path, player, player_params=player_params, m3u8=m3u8, quiet=quiet, out_cmd=out_cmd, ) else: # is_dir play_dir( api, rp.path, sifters=sifters, recursive=recursive, from_index=from_index, player=player, player_params=player_params, m3u8=m3u8, quiet=quiet, out_cmd=out_cmd, )
def display_files( pcs_files: List[PcsFile], remotepath: Optional[str], sifters: List[Sifter] = [], highlight: bool = False, show_size: bool = False, show_date: bool = False, show_md5: bool = False, show_absolute_path: bool = False, ): pcs_files = sift(pcs_files, sifters) if not pcs_files: return table = Table(box=SIMPLE, padding=0, show_edge=False) table.add_column() if show_size: table.add_column("Size", justify="right") if show_date: table.add_column("Modified Time", justify="center") if show_md5: table.add_column("md5", justify="left") table.add_column("Path", justify="left", overflow="fold") max_size_str_len = max([len(str(pcs_file.size)) for pcs_file in pcs_files]) for pcs_file in pcs_files: row: List[Union[str, Text]] = [] tp = Text("-", style="bold red") row.append(tp) if show_size: size = human_size(pcs_file.size) if pcs_file.size else "" row.append(f"{size} {pcs_file.size: >{max_size_str_len}}") if show_date: date = format_date(pcs_file.mtime) if pcs_file.mtime else "" row.append(date) if show_md5: md5 = pcs_file.md5 or "" row.append(md5) path = pcs_file.path if show_absolute_path else Path(pcs_file.path).name background = Text() if pcs_file.is_dir: tp._text = ["d"] background.style = "blue" if highlight and sifters: pats: List[Union[Pattern, str]] = list( filter( None, [sifter.pattern() for sifter in sifters if sifter.include()] ) ) highlighter = Highlighter(pats, "yellow") _path = highlighter(path) else: _path = Text(path) row.append(background + _path) table.add_row(*row) console = Console() if remotepath: title = Text(remotepath, style="italic green") console.print(title) console.print(table)
def list_file( api: BaiduPCSApi, remotepath: str, desc: bool = False, name: bool = False, time: bool = False, size: bool = False, recursive: bool = False, sifters: List[Sifter] = [], highlight: bool = False, rapiduploadinfo_file: Optional[str] = None, user_id: Optional[int] = None, user_name: Optional[str] = None, show_size: bool = False, show_date: bool = False, show_md5: bool = False, show_absolute_path: bool = False, show_dl_link: bool = False, show_hash_link: bool = False, hash_link_protocol: str = PcsRapidUploadInfo.default_hash_link_protocol(), check_md5: bool = True, csv: bool = False, only_dl_link: bool = False, only_hash_link: bool = False, ): is_dir = api.is_dir(remotepath) if is_dir: pcs_files = api.list(remotepath, desc=desc, name=name, time=time, size=size) else: pcs_files = api.meta(remotepath) pcs_files = sift(pcs_files, sifters, recursive=recursive) if not pcs_files: return if show_dl_link or show_hash_link: # Concurrently request rapiduploadinfo max_workers = DEFAULT_MAX_WORKERS semaphore = Semaphore(max_workers) with ThreadPoolExecutor(max_workers=max_workers) as executor: futs = {} for i in range(len(pcs_files)): if pcs_files[i].is_dir: continue semaphore.acquire() fut = executor.submit( sure_release, semaphore, _get_download_link_and_rapid_upload_info, api, pcs_files[i], show_dl_link=show_dl_link, show_hash_link=show_hash_link, check_md5=check_md5, ) futs[fut] = i for fut in as_completed(futs): i = futs[fut] e = fut.exception() if e is None: dl_link, rpinfo = fut.result() if rapiduploadinfo_file and rpinfo: save_rapid_upload_info( rapiduploadinfo_file, rpinfo.slice_md5, rpinfo.content_md5, rpinfo.content_crc32, rpinfo.content_length, remotepath=pcs_files[i].path, user_id=user_id, user_name=user_name, ) pcs_files[i] = pcs_files[i]._replace( dl_link=dl_link, rapid_upload_info=rpinfo) if only_dl_link and dl_link: print(dl_link) if only_hash_link and rpinfo: hash_link = getattr(rpinfo, hash_link_protocol)() print(hash_link) else: logger.error( "`list_file`: `_get_download_link_and_rapid_upload_info` error: %s", e, ) if not only_dl_link and not only_hash_link: display_files( pcs_files, remotepath, sifters=sifters, highlight=highlight, show_size=show_size, show_date=show_date, show_md5=show_md5, show_absolute_path=show_absolute_path, show_dl_link=show_dl_link, show_hash_link=show_hash_link, hash_link_protocol=hash_link_protocol, csv=csv, ) if is_dir and recursive: for pcs_file in pcs_files: if pcs_file.is_dir: list_file( api, pcs_file.path, desc=desc, name=name, time=time, size=size, recursive=recursive, sifters=sifters, highlight=highlight, rapiduploadinfo_file=rapiduploadinfo_file, user_id=user_id, user_name=user_name, show_size=show_size, show_date=show_date, show_md5=show_md5, show_absolute_path=show_absolute_path, show_dl_link=show_dl_link, show_hash_link=show_hash_link, hash_link_protocol=hash_link_protocol, check_md5=check_md5, csv=csv, only_dl_link=only_dl_link, only_hash_link=only_hash_link, )
def download( api: BaiduPCSApi, remotepaths: List[str], localdir: str, sifters: List[Sifter] = [], recursive: bool = False, from_index: int = 0, downloader: Downloader = DEFAULT_DOWNLOADER, downloadparams: DownloadParams = DEFAULT_DOWNLOADPARAMS, out_cmd: bool = False, encrypt_password: bytes = b"", ): """Download `remotepaths` to the `localdir` Args: `from_index` (int): The start index of downloading entries from EACH remote directory """ logger.debug( "`download`: sifters: %s, recursive: %s, from_index: %s, " "downloader: %s, downloadparams: %s, out_cmd: %s, has encrypt_password: %s", sifters, recursive, from_index, downloader, downloadparams, out_cmd, bool(encrypt_password), ) logger.debug( "`download`: remotepaths should be uniq %s == %s", len(remotepaths), len(set(remotepaths)), ) remotepaths = sift(remotepaths, sifters) for rp in remotepaths: if not api.exists(rp): print(f"[yellow]WARNING[/yellow]: `{rp}` does not exist.") continue if api.is_file(rp): download_file( api, rp, localdir, downloader=downloader, downloadparams=downloadparams, out_cmd=out_cmd, encrypt_password=encrypt_password, ) else: _localdir = str(Path(localdir) / os.path.basename(rp)) download_dir( api, rp, _localdir, sifters=sifters, recursive=recursive, from_index=from_index, downloader=downloader, downloadparams=downloadparams, out_cmd=out_cmd, encrypt_password=encrypt_password, ) if downloader == Downloader.me: MeDownloader._exit_executor() _progress.stop()