def add(name, episode=None): """ ret.name :str """ # action add # add bangumi by a list of bangumi name # result = {} logger.debug('add name: {} episode: {}'.format(name, episode)) if not Bangumi.get_updating_bangumi(): website.fetch(save=True, group_by_weekday=False) try: bangumi_obj = Bangumi.fuzzy_get(name=name) except Bangumi.DoesNotExist: result = {'status': 'error', 'message': '{0} not found, please check the name'.format(name)} return result followed_obj, this_obj_created = Followed.get_or_create(bangumi_name=bangumi_obj.name, defaults={'status': STATUS_FOLLOWED}) if not this_obj_created: if followed_obj.status == STATUS_FOLLOWED: result = {'status': 'warning', 'message': '{0} already followed'.format(bangumi_obj.name)} return result else: followed_obj.status = STATUS_FOLLOWED followed_obj.save() Filter.get_or_create(bangumi_name=name) bangumi_data, _ = website.get_maximum_episode(bangumi_obj, subtitle=False, max_page=MAX_PAGE) followed_obj.episode = bangumi_data['episode'] if episode is None else episode followed_obj.save() result = {'status': 'success', 'message': '{0} has been followed'.format(bangumi_obj.name)} logger.debug(result) return result
def cal(force_update: bool = False, save: bool = False, cover: Optional[List[str]] = None) -> Dict[str, List[Dict[str, Any]]]: logger.debug("cal force_update: %r save: %r", force_update, save) weekly_list = Bangumi.get_updating_bangumi() if not weekly_list: print_warning("Warning: no bangumi schedule, fetching ...") force_update = True if force_update: print_info("Fetching bangumi info ...") website.fetch(save=save) weekly_list = Bangumi.get_updating_bangumi() if cover is not None: # download cover to local cover_to_be_download = cover for daily_bangumi in weekly_list.values(): for bangumi in daily_bangumi: _, file_path = convert_cover_url_to_path(bangumi["cover"]) if not (os.path.exists(file_path) and bool(imghdr.what(file_path))): cover_to_be_download.append(bangumi["cover"]) if cover_to_be_download: print_info("Updating cover ...") download_cover(cover_to_be_download) runner = ScriptRunner() patch_list = runner.get_models_dict() for i in patch_list: weekly_list[i["update_time"].lower()].append(i) logger.debug(weekly_list) # for web api, return all subtitle group info r = weekly_list # type: Dict[str, List[Dict[str, Any]]] for day, value in weekly_list.items(): for index, bangumi in enumerate(value): bangumi["cover"] = normalize_path(bangumi["cover"]) subtitle_group = list( map( lambda x: { "name": x["name"], "id": x["id"] }, Subtitle.get_subtitle_by_id( bangumi["subtitle_group"].split(", " "")), )) r[day][index]["subtitle_group"] = subtitle_group logger.debug(r) return r
def save_data(data): """ save bangumi dict to database :type data: dict """ b, obj_created = Bangumi.get_or_create(name=data['name'], defaults=data) if not obj_created: b.status = STATUS_UPDATING b.subtitle_group = Bangumi(**data).subtitle_group b.cover = data['cover'] # if not b.cover.startswith(self.cover_url): # b.cover = self.cover_url + data['cover'] b.save()
def test_update_download(mock_download_driver: mock.Mock): """TODO: mock HTTP requests in this test""" name = "hello world" mock_website = mock.Mock() mock_website.get_maximum_episode = mock.Mock( return_value=( 4, [ Episode(episode=3, download="magnet:mm", title="t 720p", name=name), Episode(episode=4, download="magnet:4", title="t 1080p", name=name), ], ) ) Bangumi(name=name, subtitle_group="", keyword=name, cover="").save() Followed(bangumi_name=name, episode=2).save() with mock.patch("bgmi.lib.controllers.website", mock_website): update([], download=True, not_ignore=False) mock_download_driver.add_download.assert_has_calls( [ mock.call(url="magnet:mm", save_path=os.path.join(SAVE_PATH, name, "3")), mock.call(url="magnet:4", save_path=os.path.join(SAVE_PATH, name, "4")), ] )
def fetch(self, save: bool = False, group_by_weekday: bool = True) -> Any: bangumi_result = self.fetch_bangumi_calendar() if not bangumi_result: print("can't fetch anything from website") return [] Bangumi.delete_all() if save: for bangumi in bangumi_result: self.save_bangumi(bangumi) if group_by_weekday: result_group_by_weekday = defaultdict(list) for bangumi in bangumi_result: result_group_by_weekday[bangumi.update_time.lower()].append(bangumi) return result_group_by_weekday return bangumi_result
def add(name, episode=None): """ ret.name :str """ # action add # add bangumi by a list of bangumi name # result = {} logger.debug('add name: {} episode: {}'.format(name, episode)) if not Bangumi.get_updating_bangumi(): website.fetch(save=True, group_by_weekday=False) try: bangumi_obj = Bangumi.get(name=name) except Bangumi.DoesNotExist: result = { 'status': 'error', 'message': '{0} not found, please check the name'.format(name) } return result followed_obj, this_obj_created = Followed.get_or_create( bangumi_name=bangumi_obj.name, defaults={'status': STATUS_FOLLOWED}) if not this_obj_created: if followed_obj.status == STATUS_FOLLOWED: result = { 'status': 'warning', 'message': '{0} already followed'.format(bangumi_obj.name) } return result else: followed_obj.status = STATUS_FOLLOWED followed_obj.save() Filter.get_or_create(bangumi_name=name) bangumi_data, _ = website.get_maximum_episode(bangumi_obj, subtitle=False, max_page=MAX_PAGE) followed_obj.episode = bangumi_data[ 'episode'] if episode is None else episode followed_obj.save() result = { 'status': 'success', 'message': '{0} has been followed'.format(bangumi_obj.name) } logger.debug(result) return result
def followed_bangumi(): """ :return: list of bangumi followed :rtype: list[dict] """ weekly_list_followed = Bangumi.get_updating_bangumi(status=STATUS_FOLLOWED) weekly_list_updated = Bangumi.get_updating_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) for bangumi_list in weekly_list.values(): for bangumi in bangumi_list: bangumi['subtitle_group'] = [{'name': x['name'], 'id': x['id']} for x in Subtitle.get_subtitle_by_id(bangumi['subtitle_group'].split(', '))] return weekly_list
def add(name: str, episode: int = None) -> ControllerResult: """ ret.name :str """ # action add # add bangumi by a list of bangumi name logger.debug("add name: %s episode: %d", name, episode) if not Bangumi.get_updating_bangumi(): website.fetch(save=True, group_by_weekday=False) try: bangumi_obj = Bangumi.fuzzy_get(name=name) except Bangumi.DoesNotExist: result = { "status": "error", "message": f"{name} not found, please check the name", } return result followed_obj, this_obj_created = Followed.get_or_create( bangumi_name=bangumi_obj.name, defaults={"status": STATUS_FOLLOWED}) if not this_obj_created: if followed_obj.status == STATUS_FOLLOWED: result = { "status": "warning", "message": f"{bangumi_obj.name} already followed", } return result else: followed_obj.status = STATUS_FOLLOWED followed_obj.save() Filter.get_or_create(bangumi_name=name) max_episode, _ = website.get_maximum_episode(bangumi_obj, max_page=int(MAX_PAGE)) followed_obj.episode = max_episode if episode is None else episode followed_obj.save() result = { "status": "success", "message": f"{bangumi_obj.name} has been followed", } logger.debug(result) return result
def followed_bangumi() -> Dict[str, list]: """ :return: list of bangumi followed """ weekly_list_followed = Bangumi.get_updating_bangumi(status=STATUS_FOLLOWED) weekly_list_updated = Bangumi.get_updating_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) for bangumi_list in weekly_list.values(): for bangumi in bangumi_list: bangumi["subtitle_group"] = [ {"name": x["name"], "id": x["id"]} for x in Subtitle.get_subtitle_by_id( bangumi["subtitle_group"].split(", ") ) ] return weekly_list
def filter_(name, subtitle=None, include=None, exclude=None, regex=None): result = {'status': 'success', 'message': ''} try: bangumi_obj = Bangumi.fuzzy_get(name=name) except Bangumi.DoesNotExist: result['status'] = 'error' result['message'] = 'Bangumi {0} does not exist.'.format(name) return result try: Followed.get(bangumi_name=bangumi_obj.name) except Followed.DoesNotExist as exc: result['status'] = 'error' result['message'] = 'Bangumi {name} has not subscribed, try \'bgmi add "{name}"\'.' \ .format(name=bangumi_obj.name) return result followed_filter_obj, is_this_obj_created = Filter.get_or_create(bangumi_name=name) if is_this_obj_created: followed_filter_obj.save() if subtitle is not None: subtitle = [s.strip() for s in subtitle.split(',')] subtitle = [s['id'] for s in Subtitle.get_subtitle_by_name(subtitle)] subtitle_list = [s.split('.')[0] for s in bangumi_obj.subtitle_group.split(', ') if '.' in s] subtitle_list.extend(bangumi_obj.subtitle_group.split(', ')) subtitle = filter(lambda s: s in subtitle_list, subtitle) subtitle = ', '.join(subtitle) followed_filter_obj.subtitle = subtitle if include is not None: followed_filter_obj.include = include if exclude is not None: followed_filter_obj.exclude = exclude if regex is not None: followed_filter_obj.regex = regex followed_filter_obj.save() subtitle_list = list(map(lambda s: s['name'], Subtitle.get_subtitle_by_id(bangumi_obj.subtitle_group.split(', ')))) result['data'] = { 'name': name, 'subtitle_group': subtitle_list, 'followed': list(map(lambda s: s['name'], Subtitle.get_subtitle_by_id(followed_filter_obj.subtitle.split(', '))) if followed_filter_obj.subtitle else []), 'include': followed_filter_obj.include, 'exclude': followed_filter_obj.exclude, 'regex': followed_filter_obj.regex, } logger.debug(result) return result
def complete(ret): # coding=utf-8 """eval "$(bgmi complete)" to complete bgmi in bash""" updating_bangumi_names = [ x["name"] for x in Bangumi.get_updating_bangumi(order=False) ] all_config = [x for x in bgmi.config.__all__ if not x == "DATA_SOURCE"] actions_and_opts = {} helper = {} for action_dict in actions_and_arguments: actions_and_opts[action_dict["action"]] = [] for arg in action_dict.get("arguments", []): if isinstance(arg["dest"], str) and arg["dest"].startswith("-"): actions_and_opts[action_dict["action"]].append(arg) elif isinstance(arg["dest"], list): actions_and_opts[action_dict["action"]].append(arg) helper[action_dict["action"]] = action_dict.get("help", "") if "bash" in os.getenv("SHELL").lower(): # bash template_file_path = os.path.join(os.path.dirname(__file__), "..", "others", "_bgmi_completion_bash.sh") elif "zsh" in os.getenv("SHELL").lower(): # zsh template_file_path = os.path.join(os.path.dirname(__file__), "..", "others", "_bgmi_completion_zsh.sh") else: import sys print("unsupported shell {}".format(os.getenv("SHELL").lower()), file=sys.stderr) return with open(template_file_path) as template_file: shell_template = template.Template(template_file.read(), autoescape="") template_with_content = shell_template.generate( actions=ACTIONS, bangumi=updating_bangumi_names, config=all_config, actions_and_opts=actions_and_opts, source=[x["id"] for x in SUPPORT_WEBSITE], helper=helper, isinstance=isinstance, string_types=(str, ), ) # type: bytes if os.environ.get("DEBUG", False): # pragma: no cover with open("./_bgmi", "wb+") as template_file: template_file.write(template_with_content) template_with_content = template_with_content.decode("utf-8") print(template_with_content)
def complete(ret): # coding=utf-8 """eval "$(bgmi complete)" to complete bgmi in bash""" updating_bangumi_names = [ x['name'] for x in Bangumi.get_updating_bangumi(order=False) ] all_config = [x for x in bgmi.config.__all__ if not x == 'DATA_SOURCE'] actions_and_opts = {} helper = {} for action_dict in actions_and_arguments: actions_and_opts[action_dict['action']] = [] for arg in action_dict.get('arguments', []): if isinstance(arg['dest'], string_types) and arg['dest'].startswith('-'): actions_and_opts[action_dict['action']].append(arg) elif isinstance(arg['dest'], list): actions_and_opts[action_dict['action']].append(arg) helper[action_dict['action']] = action_dict.get('help', '') if 'bash' in os.getenv('SHELL').lower(): # bash template_file_path = os.path.join(os.path.dirname(__file__), '..', 'others', '_bgmi_completion_bash.sh') elif 'zsh' in os.getenv('SHELL').lower(): # zsh template_file_path = os.path.join(os.path.dirname(__file__), '..', 'others', '_bgmi_completion_zsh.sh') else: import sys print('unsupported shell {}'.format(os.getenv('SHELL').lower()), file=sys.stderr) return with open(template_file_path, 'r') as template_file: shell_template = template.Template(template_file.read(), autoescape='') template_with_content = shell_template.generate( actions=ACTIONS, bangumi=updating_bangumi_names, config=all_config, actions_and_opts=actions_and_opts, source=[x['id'] for x in SUPPORT_WEBSITE], helper=helper, isinstance=isinstance, string_types=string_types) # type: bytes if os.environ.get('DEBUG', False): # pragma: no cover with open('./_bgmi', 'wb+') as template_file: template_file.write(template_with_content) template_with_content = template_with_content.decode('utf-8') print(template_with_content)
def bangumi_calendar(self, force_update=False, save=True, cover=None): """ :param force_update: :type force_update: bool :param save: set true to enable save bangumi data to database :type save: bool :param cover: list of cover url (of scripts) want to download :type cover: list[str] """ 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 = self.fetch(save=save) else: weekly_list = Bangumi.get_updating_bangumi() if not weekly_list: print_warning('Warning: no bangumi schedule, fetching ...') weekly_list = self.fetch(save=save) if cover is not None: # download cover to local cover_to_be_download = cover for daily_bangumi in weekly_list.values(): for bangumi in daily_bangumi: _, file_path = convert_cover_url_to_path(bangumi['cover']) if not glob.glob(file_path): cover_to_be_download.append(bangumi['cover']) if cover_to_be_download: print_info('Updating cover ...') download_cover(cover_to_be_download) return weekly_list
def history(ret): m = ( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ) data = Followed.select(Followed).order_by(Followed.updated_time.asc()) bangumi_data = Bangumi.get_updating_bangumi() year = None month = None updating_bangumi = list( map(lambda s: s["name"], itertools.chain(*bangumi_data.values()))) print_info("Bangumi Timeline") for i in data: if i.status == STATUS_DELETED: slogan = "ABANDON" color = RED else: if i.bangumi_name in updating_bangumi: slogan = "FOLLOWING" color = YELLOW else: slogan = "FINISHED" color = GREEN if not i.updated_time: date = datetime.datetime.fromtimestamp(0) else: date = datetime.datetime.fromtimestamp(int(i.updated_time)) if date.year != 1970: if date.year != year: print("{}{}{}".format(GREEN, str(date.year), COLOR_END)) year = date.year if date.year == year and date.month != month: print(" |\n |--- {}{}{}\n | |".format( YELLOW, m[date.month - 1], COLOR_END)) month = date.month print(" | |--- [{}{:<9}{}] ({:<2}) {}".format( color, slogan, COLOR_END, i.episode, i.bangumi_name))
def test_cal_force_update(): class MockWebsite(BangumiMoe): def fetch_bangumi_calendar(self): bangumi = BangumiMoe().fetch_bangumi_calendar() bangumi[0].update_time = "Unknown" return bangumi with mock.patch("bgmi.lib.controllers.website", MockWebsite()): main("cal -f".split()) assert [ x.name for x in Bangumi.select().where(Bangumi.update_time == "Unknown") ], "at least 1 bangumi's update_time is 'Unknown'"
def complete(ret): # coding=utf-8 """eval "$(bgmi complete)" to complete bgmi in bash""" updating_bangumi_names = [x['name'] for x in Bangumi.get_updating_bangumi(order=False)] all_config = [x for x in bgmi.config.__all__ if not x == 'DATA_SOURCE'] actions_and_opts = {} helper = {} for action_dict in actions_and_arguments: actions_and_opts[action_dict['action']] = [] for arg in action_dict.get('arguments', []): if isinstance(arg['dest'], string_types) and arg['dest'].startswith('-'): actions_and_opts[action_dict['action']].append(arg) elif isinstance(arg['dest'], list): actions_and_opts[action_dict['action']].append(arg) helper[action_dict['action']] = action_dict.get('help', '') if 'bash' in os.getenv('SHELL').lower(): # bash template_file_path = os.path.join(os.path.dirname(__file__), '..', 'others', '_bgmi_completion_bash.sh') elif 'zsh' in os.getenv('SHELL').lower(): # zsh template_file_path = os.path.join(os.path.dirname(__file__), '..', 'others', '_bgmi_completion_zsh.sh') else: import sys print('unsupported shell {}'.format(os.getenv('SHELL').lower()), file=sys.stderr) return with open(template_file_path, 'r') as template_file: shell_template = template.Template(template_file.read(), autoescape='') template_with_content = shell_template.generate(actions=ACTIONS, bangumi=updating_bangumi_names, config=all_config, actions_and_opts=actions_and_opts, source=[x['id'] for x in SUPPORT_WEBSITE], helper=helper, isinstance=isinstance, string_types=string_types) # type: bytes if os.environ.get('DEBUG', False): # pragma: no cover with open('./_bgmi', 'wb+') as template_file: template_file.write(template_with_content) template_with_content = template_with_content.decode('utf-8') print(template_with_content)
def bangumi_calendar(self, force_update=False, save=True, cover=None): """ :param force_update: :type force_update: bool :param save: set true to enable save bangumi data to database :type save: bool :param cover: list of cover url (of scripts) want to download :type cover: list[str] """ if force_update and not test_connection(): force_update = False print_warning("Network is unreachable") if force_update: print_info("Fetching bangumi info ...") self.fetch(save=save) weekly_list = Bangumi.get_updating_bangumi() if not weekly_list: print_warning("Warning: no bangumi schedule, fetching ...") weekly_list = self.fetch(save=save) if cover is not None: # download cover to local cover_to_be_download = cover for daily_bangumi in weekly_list.values(): for bangumi in daily_bangumi: _, file_path = convert_cover_url_to_path(bangumi["cover"]) if not (os.path.exists(file_path) and imghdr.what(file_path)): cover_to_be_download.append(bangumi["cover"]) if cover_to_be_download: print_info("Updating cover ...") download_cover(cover_to_be_download) return weekly_list
def history(ret): m = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') data = Followed.select(Followed).order_by(Followed.updated_time.asc()) bangumi_data = Bangumi.get_updating_bangumi() year = None month = None updating_bangumi = list( map(lambda s: s['name'], itertools.chain(*bangumi_data.values()))) print_info('Bangumi Timeline') for i in data: if i.status == STATUS_DELETED: slogan = 'ABANDON' color = RED else: if i.bangumi_name in updating_bangumi: slogan = 'FOLLOWING' color = YELLOW else: slogan = 'FINISHED' color = GREEN if not i.updated_time: date = datetime.datetime.fromtimestamp(0) else: date = datetime.datetime.fromtimestamp(int(i.updated_time)) if date.year != 1970: if date.year != year: print('%s%s%s' % (GREEN, str(date.year), COLOR_END)) year = date.year if date.year == year and date.month != month: print(' |\n |--- %s%s%s\n | |' % (YELLOW, m[date.month - 1], COLOR_END)) month = date.month print(' | |--- [%s%-9s%s] (%-2s) %s' % (color, slogan, COLOR_END, i.episode, i.bangumi_name))
def history(ret): m = ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December') data = Followed.select(Followed).order_by(Followed.updated_time.asc()) bangumi_data = Bangumi.get_updating_bangumi() year = None month = None updating_bangumi = list(map(lambda s: s['name'], itertools.chain(*bangumi_data.values()))) print_info('Bangumi Timeline') for i in data: if i.status == STATUS_DELETED: slogan = 'ABANDON' color = RED else: if i.bangumi_name in updating_bangumi: slogan = 'FOLLOWING' color = YELLOW else: slogan = 'FINISHED' color = GREEN if not i.updated_time: date = datetime.datetime.fromtimestamp(0) else: date = datetime.datetime.fromtimestamp(int(i.updated_time)) if date.year != 1970: if date.year != year: print('%s%s%s' % (GREEN, str(date.year), COLOR_END)) year = date.year if date.year == year and date.month != month: print(' |\n |--- %s%s%s\n | |' % (YELLOW, m[date.month - 1], COLOR_END)) month = date.month print(' | |--- [%s%-9s%s] (%-2s) %s' % (color, slogan, COLOR_END, i.episode, i.bangumi_name))
def fetch_(ret): try: bangumi_obj = Bangumi.get(name=ret.name) except Bangumi.DoesNotExist: print_error('Bangumi {0} not exist'.format(ret.name)) return try: Followed.get(bangumi_name=bangumi_obj.name) except Followed.DoesNotExist: print_error('Bangumi {0} is not followed'.format(ret.name)) return followed_filter_obj = Filter.get(bangumi_name=ret.name) print_filter(followed_filter_obj) print_info('Fetch bangumi {0} ...'.format(bangumi_obj.name)) _, data = website.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'])
def fetch_(ret): try: bangumi_obj = Bangumi.get(name=ret.name) except Bangumi.DoesNotExist: print_error('Bangumi {0} not exist'.format(ret.name)) return try: Followed.get(bangumi_name=bangumi_obj.name) except Followed.DoesNotExist: print_error('Bangumi {0} is not followed'.format(ret.name)) return followed_filter_obj = Filter.get(bangumi_name=ret.name) print_filter(followed_filter_obj) print_info('Fetch bangumi {0} ...'.format(bangumi_obj.name)) _, data = website.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'])
def fetch_(ret: Any) -> None: try: bangumi_obj = Bangumi.get(name=ret.name) except Bangumi.DoesNotExist: print_error(f"Bangumi {ret.name} not exist") return try: Followed.get(bangumi_name=bangumi_obj.name) except Followed.DoesNotExist: print_error(f"Bangumi {ret.name} is not followed") return followed_filter_obj = Filter.get(bangumi_name=ret.name) print_filter(followed_filter_obj) print_info(f"Fetch bangumi {bangumi_obj.name} ...") _, data = website.get_maximum_episode( bangumi_obj, ignore_old_row=not bool(ret.not_ignore)) if not data: print_warning("Nothing.") for i in data: print_success(i.title)
def filter_(name, subtitle=None, include=None, exclude=None, regex=None): result = {'status': 'success', 'message': ''} try: bangumi_obj = Bangumi.get(name=name) except Bangumi.DoesNotExist: result['status'] = 'error' result['message'] = 'Bangumi {0} does not exist.'.format(name) return result try: Followed.get(bangumi_name=bangumi_obj.name) except Followed.DoesNotExist as exc: result['status'] = 'error' result['message'] = 'Bangumi {name} has not subscribed, try \'bgmi add "{name}"\'.' \ .format(name=bangumi_obj.name) return result followed_filter_obj, is_this_obj_created = Filter.get_or_create( bangumi_name=name) if is_this_obj_created: followed_filter_obj.save() if subtitle is not None: subtitle = [s.strip() for s in subtitle.split(',')] subtitle = [s['id'] for s in Subtitle.get_subtitle_by_name(subtitle)] subtitle_list = [ s.split('.')[0] for s in bangumi_obj.subtitle_group.split(', ') if '.' in s ] subtitle_list.extend(bangumi_obj.subtitle_group.split(', ')) subtitle = filter(lambda s: s in subtitle_list, subtitle) subtitle = ', '.join(subtitle) followed_filter_obj.subtitle = subtitle if include is not None: followed_filter_obj.include = include if exclude is not None: followed_filter_obj.exclude = exclude if regex is not None: followed_filter_obj.regex = regex followed_filter_obj.save() subtitle_list = list( map( lambda s: s['name'], Subtitle.get_subtitle_by_id( bangumi_obj.subtitle_group.split(', ')))) result['data'] = { 'name': name, 'subtitle_group': subtitle_list, 'followed': list( map( lambda s: s['name'], Subtitle. get_subtitle_by_id(followed_filter_obj.subtitle.split(', ') )) if followed_filter_obj.subtitle else []), 'include': followed_filter_obj.include, 'exclude': followed_filter_obj.exclude, 'regex': followed_filter_obj.regex, } logger.debug(result) return result
def update(name, download=None, not_ignore=False): logger.debug( 'updating bangumi info with args: download: {}'.format(download)) result = { 'status': 'info', 'message': '', 'data': { 'updated': [], 'downloaded': [] } } ignore = not bool(not_ignore) 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'] + 60 * 60 * 24) < now: followed_obj = Followed.get(bangumi_name=i['bangumi_name']) followed_obj.status = STATUS_FOLLOWED followed_obj.save() for script in ScriptRunner().scripts: obj = script.Model().obj if obj.updated_time and int(obj.updated_time + 60 * 60 * 24) < now: obj.status = STATUS_FOLLOWED obj.save() print_info('updating bangumi data ...') website.fetch(save=True, group_by_weekday=False) print_info('updating subscriptions ...') download_queue = [] if download: if not name: print_warning('No specified bangumi, ignore `--download` option') if len(name) > 1: print_warning( 'Multiple specified bangumi, ignore `--download` option') if not name: updated_bangumi_obj = Followed.get_all_followed() else: updated_bangumi_obj = [] for i in name: try: f = Followed.get(bangumi_name=i) f = model_to_dict(f) updated_bangumi_obj.append(f) except DoesNotExist: pass runner = ScriptRunner() script_download_queue = runner.run() for subscribe in updated_bangumi_obj: print_info('fetching %s ...' % subscribe['bangumi_name']) try: bangumi_obj = Bangumi.get(name=subscribe['bangumi_name']) except Bangumi.DoesNotExist: print_error('Bangumi<{0}> does not exists.'.format( subscribe['bangumi_name']), exit_=False) continue try: followed_obj = Followed.get(bangumi_name=subscribe['bangumi_name']) except Followed.DoesNotExist: print_error('Bangumi<{0}> is not followed.'.format( subscribe['bangumi_name']), exit_=False) continue episode, all_episode_data = website.get_maximum_episode( bangumi=bangumi_obj, ignore_old_row=ignore, max_page=1) if (episode.get('episode') > subscribe['episode']) or (len(name) == 1 and download): if len(name) == 1 and download: episode_range = 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() result['data']['updated'].append({ 'bangumi': subscribe['bangumi_name'], 'episode': episode['episode'] }) for i in episode_range: for epi in all_episode_data: if epi['episode'] == i: download_queue.append(epi) break if download is not None: result['data']['downloaded'] = download_queue download_prepare(download_queue) download_prepare(script_download_queue) print_info('Re-downloading ...') download_prepare( Download.get_all_downloads(status=STATUS_NOT_DOWNLOAD)) return result
def update(name, download=None, not_ignore=False): logger.debug('updating bangumi info with args: download: {}'.format(download)) result = {'status': 'info', 'message': '', 'data': {'updated': [], 'downloaded': []}} ignore = not bool(not_ignore) 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'] + 60 * 60 * 24) < now: followed_obj = Followed.get(bangumi_name=i['bangumi_name']) followed_obj.status = STATUS_FOLLOWED followed_obj.save() for script in ScriptRunner().scripts: obj = script.Model().obj if obj.updated_time and int(obj.updated_time + 60 * 60 * 24) < now: obj.status = STATUS_FOLLOWED obj.save() print_info('updating subscriptions ...') download_queue = [] if download: if not name: print_warning('No specified bangumi, ignore `--download` option') if len(name) > 1: print_warning('Multiple specified bangumi, ignore `--download` option') if not name: updated_bangumi_obj = Followed.get_all_followed() else: updated_bangumi_obj = [] for i in name: try: f = Followed.get(bangumi_name=i) f = model_to_dict(f) updated_bangumi_obj.append(f) except DoesNotExist: pass runner = ScriptRunner() script_download_queue = runner.run() for subscribe in updated_bangumi_obj: print_info('fetching %s ...' % subscribe['bangumi_name']) try: bangumi_obj = Bangumi.get(name=subscribe['bangumi_name']) except Bangumi.DoesNotExist: print_error('Bangumi<{0}> does not exists.'.format(subscribe['bangumi_name']), exit_=False) continue try: followed_obj = Followed.get(bangumi_name=subscribe['bangumi_name']) except Followed.DoesNotExist: print_error('Bangumi<{0}> is not followed.'.format(subscribe['bangumi_name']), exit_=False) continue episode, all_episode_data = website.get_maximum_episode(bangumi=bangumi_obj, ignore_old_row=ignore, max_page=1) if (episode.get('episode') > subscribe['episode']) or (len(name) == 1 and download): if len(name) == 1 and download: episode_range = 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() result['data']['updated'].append({'bangumi': subscribe['bangumi_name'], 'episode': episode['episode']}) for i in episode_range: for epi in all_episode_data: if epi['episode'] == i: download_queue.append(epi) break if download is not None: result['data']['downloaded'] = download_queue download_prepare(download_queue) download_prepare(script_download_queue) print_info('Re-downloading ...') download_prepare(Download.get_all_downloads( status=STATUS_NOT_DOWNLOAD)) return result
def filter_(name, subtitle=None, include=None, exclude=None, regex=None): result = {"status": "success", "message": ""} try: bangumi_obj = Bangumi.fuzzy_get(name=name) except Bangumi.DoesNotExist: result["status"] = "error" result["message"] = "Bangumi {} does not exist.".format(name) return result try: Followed.get(bangumi_name=bangumi_obj.name) except Followed.DoesNotExist as exc: result["status"] = "error" result[ "message"] = "Bangumi {name} has not subscribed, try 'bgmi add \"{name}\"'.".format( name=bangumi_obj.name) return result followed_filter_obj, is_this_obj_created = Filter.get_or_create( bangumi_name=name) if is_this_obj_created: followed_filter_obj.save() if subtitle is not None: subtitle = [s.strip() for s in subtitle.split(",")] subtitle = [s["id"] for s in Subtitle.get_subtitle_by_name(subtitle)] subtitle_list = [ s.split(".")[0] for s in bangumi_obj.subtitle_group.split(", ") if "." in s ] subtitle_list.extend(bangumi_obj.subtitle_group.split(", ")) subtitle = filter(lambda s: s in subtitle_list, subtitle) subtitle = ", ".join(subtitle) followed_filter_obj.subtitle = subtitle if include is not None: followed_filter_obj.include = include if exclude is not None: followed_filter_obj.exclude = exclude if regex is not None: followed_filter_obj.regex = regex followed_filter_obj.save() subtitle_list = list( map( lambda s: s["name"], Subtitle.get_subtitle_by_id( bangumi_obj.subtitle_group.split(", ")), )) result["data"] = { "name": name, "subtitle_group": subtitle_list, "followed": list( map( lambda s: s["name"], Subtitle. get_subtitle_by_id(followed_filter_obj.subtitle.split(", ")), ) if followed_filter_obj.subtitle else []), "include": followed_filter_obj.include, "exclude": followed_filter_obj.exclude, "regex": followed_filter_obj.regex, } logger.debug(result) return result
def update(name, download=None, not_ignore=False): logger.debug( "updating bangumi info with args: download: {}".format(download)) result = { "status": "info", "message": "", "data": { "updated": [], "downloaded": [] }, } ignore = not bool(not_ignore) 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"] + 60 * 60 * 24) < now: followed_obj = Followed.get(bangumi_name=i["bangumi_name"]) followed_obj.status = STATUS_FOLLOWED followed_obj.save() for script in ScriptRunner().scripts: obj = script.Model().obj if obj.updated_time and int(obj.updated_time + 60 * 60 * 24) < now: obj.status = STATUS_FOLLOWED obj.save() print_info("updating subscriptions ...") download_queue = [] if download: if not name: print_warning("No specified bangumi, ignore `--download` option") if len(name) > 1: print_warning( "Multiple specified bangumi, ignore `--download` option") if not name: updated_bangumi_obj = Followed.get_all_followed() else: updated_bangumi_obj = [] for i in name: try: f = Followed.get(bangumi_name=i) f = model_to_dict(f) updated_bangumi_obj.append(f) except DoesNotExist: pass runner = ScriptRunner() script_download_queue = runner.run() for subscribe in updated_bangumi_obj: print_info("fetching %s ..." % subscribe["bangumi_name"]) try: bangumi_obj = Bangumi.get(name=subscribe["bangumi_name"]) except Bangumi.DoesNotExist: print_error( "Bangumi<{}> does not exists.".format( subscribe["bangumi_name"]), exit_=False, ) continue try: followed_obj = Followed.get(bangumi_name=subscribe["bangumi_name"]) except Followed.DoesNotExist: print_error( "Bangumi<{}> is not followed.".format( subscribe["bangumi_name"]), exit_=False, ) continue episode, all_episode_data = website.get_maximum_episode( bangumi=bangumi_obj, ignore_old_row=ignore, max_page=1) if (episode.get("episode") > subscribe["episode"]) or (len(name) == 1 and download): if len(name) == 1 and download: episode_range = 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() result["data"]["updated"].append({ "bangumi": subscribe["bangumi_name"], "episode": episode["episode"], }) for i in episode_range: for epi in all_episode_data: if epi["episode"] == i: download_queue.append(epi) break if download is not None: result["data"]["downloaded"] = download_queue download_prepare(download_queue) download_prepare(script_download_queue) print_info("Re-downloading ...") download_prepare( Download.get_all_downloads(status=STATUS_NOT_DOWNLOAD)) return result
def update(name: List[str], download: Any = None, not_ignore: bool = False) -> ControllerResult: logger.debug("updating bangumi info with args: download: %r", download) result: Dict[str, Any] = { "status": "info", "message": "", "data": { "updated": [], "downloaded": [] }, } ignore = not bool(not_ignore) 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"] + 60 * 60 * 24) < now: followed_obj = Followed.get(bangumi_name=i["bangumi_name"]) followed_obj.status = STATUS_FOLLOWED followed_obj.save() for script in ScriptRunner().scripts: obj = script.Model().obj if obj.updated_time and int(obj.updated_time + 60 * 60 * 24) < now: obj.status = STATUS_FOLLOWED obj.save() print_info("updating subscriptions ...") download_queue = [] if download: if not name: print_warning("No specified bangumi, ignore `--download` option") if len(name) > 1: print_warning( "Multiple specified bangumi, ignore `--download` option") if not name: updated_bangumi_obj = Followed.get_all_followed() else: updated_bangumi_obj = [] for n in name: try: f = Followed.get(bangumi_name=n) f = model_to_dict(f) updated_bangumi_obj.append(f) except DoesNotExist: pass runner = ScriptRunner() script_download_queue = runner.run() for subscribe in updated_bangumi_obj: print_info(f"fetching {subscribe['bangumi_name']} ...") try: bangumi_obj = Bangumi.get(name=subscribe["bangumi_name"]) except Bangumi.DoesNotExist: print_error( "Bangumi<{}> does not exists.".format( subscribe["bangumi_name"]), exit_=False, ) continue try: followed_obj = Followed.get(bangumi_name=subscribe["bangumi_name"]) except Followed.DoesNotExist: print_error( "Bangumi<{}> is not followed.".format( subscribe["bangumi_name"]), exit_=False, ) continue try: episode, all_episode_data = website.get_maximum_episode( bangumi=bangumi_obj, ignore_old_row=ignore, max_page=int(MAX_PAGE)) except requests.exceptions.ConnectionError as e: print_warning(f"error {e} to fetch {bangumi_obj.name}, skip") continue if (episode > subscribe["episode"]) or (len(name) == 1 and download): if len(name) == 1 and download: episode_range = download else: episode_range = range(subscribe["episode"] + 1, episode + 1) print_success( f"{subscribe['bangumi_name']} updated, episode: {episode:d}" ) followed_obj.episode = episode followed_obj.status = STATUS_UPDATED followed_obj.updated_time = int(time.time()) followed_obj.save() result["data"]["updated"].append({ "bangumi": subscribe["bangumi_name"], "episode": episode }) for i in episode_range: for epi in all_episode_data: if epi.episode == i: download_queue.append(epi) break if download is not None: result["data"]["downloaded"] = download_queue download_prepare(download_queue) download_prepare(script_download_queue) print_info("Re-downloading ...") download_prepare([ Episode( **{ key: value for key, value in x.items() if key not in ["id", "status"] }) for x in Download.get_all_downloads(status=STATUS_NOT_DOWNLOAD) ]) return result
def filter_( name: str, subtitle: Optional[str] = None, include: Optional[str] = None, exclude: Optional[str] = None, regex: Optional[str] = None, ) -> ControllerResult: result = {"status": "success", "message": ""} # type: Dict[str, Any] try: bangumi_obj = Bangumi.fuzzy_get(name=name) except Bangumi.DoesNotExist: result["status"] = "error" result["message"] = f"Bangumi {name} does not exist." return result try: Followed.get(bangumi_name=bangumi_obj.name) except Followed.DoesNotExist: result["status"] = "error" result[ "message"] = "Bangumi {name} has not subscribed, try 'bgmi add \"{name}\"'.".format( name=bangumi_obj.name) return result followed_filter_obj, is_this_obj_created = Filter.get_or_create( bangumi_name=bangumi_obj.name) if is_this_obj_created: followed_filter_obj.save() if subtitle is not None: _subtitle = [s.strip() for s in subtitle.split(",")] _subtitle = [s["id"] for s in Subtitle.get_subtitle_by_name(_subtitle)] subtitle_list = [ s.split(".")[0] for s in bangumi_obj.subtitle_group.split(", ") if "." in s ] subtitle_list.extend(bangumi_obj.subtitle_group.split(", ")) followed_filter_obj.subtitle = ", ".join( filter(lambda s: s in subtitle_list, _subtitle)) if include is not None: followed_filter_obj.include = include if exclude is not None: followed_filter_obj.exclude = exclude if regex is not None: followed_filter_obj.regex = regex followed_filter_obj.save() subtitle_list = [ s["name"] for s in Subtitle.get_subtitle_by_id( bangumi_obj.subtitle_group.split(", ")) ] result["data"] = { "name": bangumi_obj.name, "subtitle_group": subtitle_list, "followed": [ s["name"] for s in Subtitle.get_subtitle_by_id( followed_filter_obj.subtitle.split(", ")) ] if followed_filter_obj.subtitle else [], "include": followed_filter_obj.include, "exclude": followed_filter_obj.exclude, "regex": followed_filter_obj.regex, } logger.debug(result) return result