def download_status(status=None): print_info('Print download status in database') DownloadService.download_status(status=status) print() print_info('Print download status in aria2c-rpc') server = PatchedServerProxy(ARIA2_RPC_URL) # self.server.aria2 status_dict = { STATUS_DOWNLOADING: ['tellActive'], STATUS_NOT_DOWNLOAD: ['tellWaiting'], STATUS_DOWNLOADED: ['tellStopped'], None: ['tellStopped', 'tellWaiting', 'tellActive'], } for method in status_dict.get(status): if method not in ('tellActive', ): params = (0, 1000) else: params = () data = server.aria2[method](*params) if data: print_warning('RPC {0}:'.format(method), indicator=False) for row in data: print_success('- {0}'.format(row['dir']), indicator=False) for file in row['files']: print_info(' * {0}'.format(file['path']), indicator=False)
def add(ret): # action add # add bangumi by a list of bangumi name if not Bangumi.get_all_bangumi(): print_warning('No bangumi data in database, fetching...') update(ret) for bangumi in ret.action.add.name: bangumi_obj = Bangumi(name=bangumi) data = bangumi_obj.select(one=True, fields=['id', 'name', 'keyword']) if data: followed_obj = Followed(bangumi_name=data['name'], status=STATUS_FOLLOWED) followed_obj.select_obj() if not followed_obj or followed_obj.status == STATUS_NORMAL: if not followed_obj: ret, _ = get_maximum_episode(bangumi_obj, subtitle=False) followed_obj.episode = ret['episode'] followed_obj.save() else: followed_obj.status = STATUS_FOLLOWED followed_obj.save() print_success('{0} has followed'.format(bangumi_obj)) else: print_warning('{0} already followed'.format(bangumi_obj)) else: print_error('{0} not found, please check the name'.format(bangumi))
def setup(): if not os.path.exists(BGMI_PATH): print_warning('BGMI_PATH %s does not exist, installing' % BGMI_PATH) from bgmi.setup import create_dir, install_crontab create_dir() install_crontab() if not os.path.exists(DB_PATH): init_db(DB_PATH) main()
def check_aria2c_version(): url = ARIA2_RPC_URL.split('/') url[2] = ARIA2_RPC_TOKEN + '@' + url[2] url = '/'.join(url) s = ServerProxy(url) r = s.aria2.getVersion(ARIA2_RPC_TOKEN, ) version = r['version'] if version: Aria2DownloadRPC.old_version = version < '1.18.4' else: print_warning('Get aria2c version failed')
def setup(): if not os.path.exists(BGMI_PATH): print_warning('BGMI_PATH %s does not exist, installing' % BGMI_PATH) from bgmi.setup import create_dir, install_crontab create_dir() if not platform.system() == 'Windows': # if not input('Do you want to install a crontab to auto-download bangumi?(Y/n): ') == 'n': install_crontab() # if not os.path.exists(DB_PATH): init_db(DB_PATH) main()
def followed(ret): if ret.action.followed == FOLLOWED_ACTION_MARK: print_warning( 'Warning: bgmi followed mark is deprecated, please use bgmi mark instead.' ) ret.action.mark = ret.action.followed.mark mark(ret) else: print_warning( 'Warning: bgmi followed list is deprecated, please use bgmi cal followed instead.' ) bangumi_calendar(force_update=False, followed=True, save=False)
def download(self): overwrite = '--overwrite' if self.overwrite else '' command = [ BGMI_LX_PATH, 'download', '--torrent', overwrite, '--output-dir={0}'.format(self.save_path), self.torrent, '--verification-code-path={0}'.format( os.path.join(BGMI_TMP_PATH, 'vcode.jpg')) ] print_info('Run command {0}'.format(' '.join(command))) print_warning('Verification code path: {0}'.format( os.path.join(BGMI_TMP_PATH, 'vcode.jpg'))) self.call(command)
def create_dir(): if not os.environ.get('HOME', ''): print_warning('$HOME not set, use \'/tmp/\'') tools_path = os.path.join(BGMI_PATH, 'tools') # bgmi home dir path_to_create = (BGMI_PATH, BGMI_SAVE_PATH, BGMI_TMP_PATH, tools_path) try: for path in path_to_create: if not os.path.exists(path): print_success('%s created successfully' % path) os.mkdir(path) else: print_warning('%s already exists' % path) except OSError as e: print_error('Error: {0}'.format(str(e)))
def delete(ret): # action delete # just delete subscribed bangumi or clear all the subscribed bangumi if ret.action.delete.clear_all: if Followed.delete_followed(batch=ret.action.delete.batch): print_success('all subscriptions have been deleted') else: print_error('user canceled') elif ret.action.delete.name: for name in ret.action.delete.name: followed = Followed(bangumi_name=name) if followed.select(): followed.delete() print_warning('Bangumi %s has been deleted' % name) else: print_error('Bangumi %s does not exist' % name, exit_=False) else: print_warning('Nothing has been done.')
def install(): # install xunlei-lixian import tarfile import requests print_info( 'Downloading xunlei-lixian from https://github.com/iambus/xunlei-lixian/' ) r = requests.get( 'https://github.com/iambus/xunlei-lixian/tarball/master', stream=True, headers={'Accept-Encoding': ''}) f = NamedTemporaryFile(delete=False) with f: for chunk in r.iter_content(chunk_size=1024): if chunk: f.write(chunk) f.close() print_success('Download successfully, save at %s, extracting ...' % f.name) zip_file = tarfile.open(f.name, 'r:gz') zip_file.extractall(os.path.join(BGMI_PATH, 'tools/xunlei-lixian')) dir_name = zip_file.getnames()[0] print_info('Create link file ...') if not os.path.exists(BGMI_LX_PATH): os.symlink( os.path.join( BGMI_PATH, 'tools/xunlei-lixian/{0}/lixian_cli.py'.format(dir_name)), BGMI_LX_PATH) else: print_warning('{0} already exists'.format(BGMI_LX_PATH)) print_success('All done') print_info( 'Please run command \'{0} config\' to configure your lixian-xunlei ' '(Notice: only for Thunder VIP)'.format(BGMI_LX_PATH))
def fetch_(ret): bangumi_obj = Bangumi(name=ret.name) bangumi_obj.select_obj() followed_obj = Followed(bangumi_name=bangumi_obj.name) followed_obj.select_obj() followed_filter_obj = Filter(bangumi_name=ret.name) followed_filter_obj.select_obj() print_filter(followed_filter_obj) if bangumi_obj: print_info('Fetch bangumi {0} ...'.format(bangumi_obj.name)) _, data = get_maximum_episode( bangumi_obj, ignore_old_row=False if ret.not_ignore else True) if not data: print_warning('Nothing.') for i in data: print_success(i['title']) else: print_error('Bangumi {0} not exist'.format(ret.name))
def download_status(status=None): last_status = -1 for download_data in Download.get_all_downloads(status=status): latest_status = download_data['status'] name = ' {0}. <{1}: {2}>'.format(download_data['id'], download_data['name'], download_data['episode']) if latest_status != last_status: if latest_status == STATUS_DOWNLOADING: print('Downloading items:') elif latest_status == STATUS_NOT_DOWNLOAD: print('Not downloaded items:') elif latest_status == STATUS_DOWNLOADED: print('Downloaded items:') if download_data['status'] == STATUS_NOT_DOWNLOAD: print_info(name, indicator=False) elif download_data['status'] == STATUS_DOWNLOADING: print_warning(name, indicator=False) elif download_data['status'] == STATUS_DOWNLOADED: print_success(name, indicator=False) last_status = download_data['status']
def download_status(status=None): Aria2DownloadRPC.check_aria2c_version() print_info('Print download status in database') DownloadService.download_status(status=status) print() print_info('Print download status in aria2c-rpc') try: server = PatchedServerProxy(ARIA2_RPC_URL) # self.server.aria2 status_dict = { STATUS_DOWNLOADING: ['tellActive'], STATUS_NOT_DOWNLOAD: ['tellWaiting'], STATUS_DOWNLOADED: ['tellStopped'], None: ['tellStopped', 'tellWaiting', 'tellActive'], } for method in status_dict.get(status): if method not in ('tellActive', ): params = (0, 1000) else: params = () if Aria2DownloadRPC.old_version: data = server.aria2[method](*params) else: data = server.aria2[method](ARIA2_RPC_TOKEN, *params) if data: print_warning('RPC {0}:'.format(method), indicator=False) for row in data: print_success('- {0}'.format(row['dir']), indicator=False) for file_ in row['files']: print_info(' * {0}'.format(file_['path']), indicator=False) except Exception as e: print_error('Cannot connect to aria2-rpc server')
def install(): print_warning('Please run `pip install transmissionrpc`')
def update(ret): ignore = False if ret.not_ignore else True print_info('marking bangumi status ...') now = int(time.time()) for i in Followed.get_all_followed(): if i['updated_time'] and int(i['updated_time'] + 86400) < now: followed_obj = Followed(bangumi_name=i['bangumi_name']) followed_obj.status = STATUS_FOLLOWED followed_obj.save() print_info('updating bangumi data ...') fetch(save=True, group_by_weekday=False) print_info('updating subscriptions ...') download_queue = [] if ret.download: if not ret.name: print_warning('No specified bangumi, ignore `--download` option') if len(ret.name) > 1: print_warning( 'Multiple specified bangumi, ignore `--download` option') if not ret.name: updated_bangumi_obj = Followed.get_all_followed() else: updated_bangumi_obj = [] for i in ret.name: f = Followed(bangumi_name=i) f.select_obj() updated_bangumi_obj.append(f) for subscribe in updated_bangumi_obj: print_info('fetching %s ...' % subscribe['bangumi_name']) bangumi_obj = Bangumi(name=subscribe['bangumi_name']) bangumi_obj.select_obj() followed_obj = Followed(bangumi_name=subscribe['bangumi_name']) followed_obj.select_obj() # filter by subtitle group if not bangumi_obj or not followed_obj: print_error( 'Bangumi<{0}> does not exist or not been followed.'.format( subscribe['bangumi_name']), exit_=False) continue episode, all_episode_data = get_maximum_episode(bangumi=bangumi_obj, ignore_old_row=ignore, max_page=1) if (episode.get('episode') > subscribe['episode']) or (len( ret.name) == 1 and ret.download): if len(ret.name) == 1 and ret.download: episode_range = ret.download else: episode_range = range(subscribe['episode'] + 1, episode.get('episode', 0) + 1) print_success('%s updated, episode: %d' % (subscribe['bangumi_name'], episode['episode'])) followed_obj.episode = episode['episode'] followed_obj.status = STATUS_UPDATED followed_obj.updated_time = int(time.time()) followed_obj.save() for i in episode_range: for epi in all_episode_data: if epi['episode'] == i: download_queue.append(epi) break if ret.download is not None: download_prepare(download_queue) print_info('Re-downloading ...') download_prepare( Download.get_all_downloads(status=STATUS_NOT_DOWNLOAD))
def install(): print_warning('Please install aria2 by yourself')
def bangumi_calendar(force_update=False, today=False, followed=False, save=True): env_columns = get_terminal_col() if env_columns < 36: print_error('terminal window is too small.') row = int(env_columns / 36 if env_columns / 36 <= 3 else 3) if force_update and not test_connection(): force_update = False print_warning('network is unreachable') if force_update: print_info('fetching bangumi info ...') Bangumi.delete_all() weekly_list = fetch(save=save, status=True) else: if followed: weekly_list_followed = Bangumi.get_all_bangumi( status=STATUS_FOLLOWED) weekly_list_updated = Bangumi.get_all_bangumi( status=STATUS_UPDATED) weekly_list = defaultdict(list) for k, v in chain(weekly_list_followed.items(), weekly_list_updated.items()): weekly_list[k].extend(v) else: weekly_list = Bangumi.get_all_bangumi() if not weekly_list: if not followed: print_warning('warning: no bangumi schedule, fetching ...') weekly_list = fetch(save=save) else: print_warning('you have not subscribed any bangumi') def shift(seq, n): n = n % len(seq) return seq[n:] + seq[:n] def print_line(): num = 33 # print('+', '-' * num, '+', '-' * num, '+', '-' * num, '+') split = '-' * num + ' ' print(split * row) if today: weekday_order = (Bangumi.week[datetime.datetime.today().weekday()], ) else: weekday_order = shift(Bangumi.week, datetime.datetime.today().weekday()) spacial_append_chars = ['Ⅱ', 'Ⅲ', '♪', 'Δ', '×', '☆'] spacial_remove_chars = [] for index, weekday in enumerate(weekday_order): if weekly_list[weekday.lower()]: print( '\033[1;32m%s. \033[0m' % (weekday if not today else 'Bangumi Schedule for Today (%s)' % weekday), end='') if not followed: print() print_line() for i, bangumi in enumerate(weekly_list[weekday.lower()]): if isinstance(bangumi['name'], _unicode): # bangumi['name'] = bangumi['name'] pass if bangumi['status'] in (STATUS_UPDATED, STATUS_FOLLOWED ) and 'episode' in bangumi: bangumi['name'] = '%s(%d)' % (bangumi['name'], bangumi['episode']) half = len( re.findall('[%s]' % string.printable, bangumi['name'])) full = (len(bangumi['name']) - half) space_count = 34 - (full * 2 + half) for s in spacial_append_chars: if s in bangumi['name']: space_count += 1 for s in spacial_remove_chars: if s in bangumi['name']: space_count -= 1 if bangumi['status'] == STATUS_FOLLOWED: bangumi['name'] = '\033[1;33m%s\033[0m' % bangumi['name'] if bangumi['status'] == STATUS_UPDATED: bangumi['name'] = '\033[1;32m%s\033[0m' % bangumi['name'] if followed: if i > 0: print(' ' * 5, end='') print(bangumi['name'], bangumi['subtitle_group']) else: print(' ' + bangumi['name'], ' ' * space_count, end='') if (i + 1) % row == 0 or i + 1 == len( weekly_list[weekday.lower()]): print() if not followed: print()
def check_path(self): if not os.path.exists(self.save_path): print_warning('Create dir {0}'.format(self.save_path)) os.makedirs(self.save_path)