def followed_bangumi(): 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) 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( bangumi['subtitle_group'].split(', '))] return weekly_list
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 get(self): is_json = self.get_argument('json', False) is_old = self.get_argument('old', False) if not os.path.exists(DB_PATH): self.write('BGmi db file not found.') self.finish() return data = Followed.get_all_followed(STATUS_NORMAL, STATUS_UPDATING, order='followed.updated_time', desc=True) followed = map(lambda b: b['bangumi_name'], data) data = Followed.get_all_followed(STATUS_NORMAL, STATUS_UPDATING if not is_old else STATUS_END, order='followed.updated_time', desc=True) calendar = Bangumi.get_all_bangumi() def shift(seq, n): n %= len(seq) return seq[n:] + seq[:n] weekday_order = shift(WEEK, datetime.datetime.today().weekday()) cal_ordered = OrderedDict() for week in weekday_order: cal_ordered[week] = calendar[week.lower()] if is_json: self.write(json.dumps(cal_ordered)) self.finish() else: self.render('templates/bangumi.html', data=data, cal=cal_ordered, followed=list(followed), version=__version__)
def add(name, episode=None): """ ret.name :str """ # action add # add bangumi by a list of bangumi name # result = {} if not Bangumi.get_all_bangumi(): website.fetch(save=True, group_by_weekday=False) bangumi_obj = Bangumi(name=name) 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: bangumi_data, _ = website.get_maximum_episode(bangumi_obj, subtitle=False, max_page=1) followed_obj.episode = bangumi_data[ 'episode'] if episode is None else episode followed_obj.save() else: followed_obj.status = STATUS_FOLLOWED followed_obj.save() result = { 'status': 'success', 'message': '{0} has been followed'.format(bangumi_obj) } else: result = { 'status': 'warning', 'message': '{0} already followed'.format(bangumi_obj) } else: result = { 'status': 'error', 'message': '{0} not found, please check the name'.format(name) } return result
def bangumi_calendar(self, force_update=False, save=True, cover=False): 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_all_bangumi() if not weekly_list: print_warning('warning: no bangumi schedule, fetching ...') weekly_list = self.fetch(save=save) runner = ScriptRunner() patch_list = runner.get_models_dict() for i in patch_list: weekly_list[i['update_time'].lower()].append(i) if cover: # download cover to local cover_to_be_download = [] for daily_bangumi in weekly_list.values(): for bangumi in daily_bangumi: followed_obj = Followed(bangumi_name=bangumi['name']) if followed_obj: bangumi['status'] = followed_obj.status _, file_path, _ = self.convert_cover_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') for cover in tqdm.tqdm(cover_to_be_download): self.download_cover(cover) return weekly_list
def test_get_all_bangumi(self): from collections import defaultdict self.assertIsInstance(Bangumi.get_all_bangumi(), defaultdict)
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()