Skip to content

Commit

Permalink
bgm.tv 跳过 OVA 剧场版等
Browse files Browse the repository at this point in the history
  • Loading branch information
kjtsune committed Sep 11, 2023
1 parent c9c92af commit d2fe3ea
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 43 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -186,9 +186,9 @@ macOS 可能无法开机自启
1. 5季或者90集以上的条目暂不支持。
2. 日志提示 `Unauthorized` 一般是令牌过期或者没填对,Windows 会自动弹出令牌生成页面。
3. 由于 `bgm.tv``续集` 不一定是下一季,导致第几季可能关联失败。
目前把 `续集` 里:集数大于3,同时第一集的序号小于2的 `续集` 当作正常的下一季。
目前把 `续集` 里:集数大于3,同时第一集的序号小于2的 `续集` 当作下一季的开始。
且只保留类型为 TV 的续集(`类型在标题右侧灰字`),跳过类型为 OVA 剧场版 WEB 等的。
如果还有其他特殊情况,可以反馈。
同时还会核查 Emby 里的季上映时间(一般是 TMDb 的时间)与 bgm.tv 的上映时间相差是否超过15天,来保证准确性。

## 播放器相关:

Expand Down
40 changes: 23 additions & 17 deletions utils/bangumi_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,23 +85,26 @@ def get_target_season_episode_id(self, subject_id, target_season: int, target_ep
ep_num_list = target_ep if isinstance(target_ep, list) else None
target_ep = ep_num_list[0] if isinstance(target_ep, list) else target_ep

if target_season >= 5 or (target_ep and target_ep > 99):
if target_season > 5 or (target_ep and target_ep > 99):
return None, None if target_ep else None

if target_season == 1:
if not target_ep:
return current_id
fist_part = True
while True:
if not target_ep:
return current_id
if not fist_part:
current_info = self.get_subject(current_id)
if current_info['platform'] != 'TV':
continue
episodes = self.get_episodes(current_id)
ep_info = episodes['data']
_target_ep = [i for i in ep_info if i['sort'] == target_ep]
if _target_ep:
if ep_num_list:
return current_id, [i['id'] for i in ep_info if i['sort'] in ep_num_list]
return current_id, _target_ep[0]['id']
normal_season = True if episodes['total'] > 3 and ep_info[0]['sort'] <= 1 else False
if normal_season:
_target_ep = [i for i in ep_info if i['sort'] == target_ep]
if _target_ep:
if ep_num_list:
return current_id, [i['id'] for i in ep_info if i['sort'] in ep_num_list]
return current_id, _target_ep[0]['id']
if not fist_part and normal_season:
break
related = self.get_related_subjects(current_id)
Expand All @@ -118,23 +121,26 @@ def get_target_season_episode_id(self, subject_id, target_season: int, target_ep
if not next_id:
break
current_id = next_id[0]['id']
current_info = self.get_subject(current_id)
if current_info['platform'] != 'TV':
continue
episodes = self.get_episodes(current_id)
ep_info = episodes['data']
normal_season = True if episodes['total'] > 3 and ep_info[0]['sort'] <= 1 else False
_target_ep = [i for i in ep_info if i['sort'] == target_ep]
need_next_part = False if target_ep and _target_ep else True
if normal_season and not need_next_part:
ep_found = True if target_ep and _target_ep else False
if normal_season:
season_num += 1
if season_num > target_season:
break
if season_num == target_season:
if not target_ep:
return current_id
if _target_ep:
if ep_num_list:
return current_id, [i['id'] for i in ep_info if i['sort'] in ep_num_list]
return current_id, _target_ep[0]['id']
if need_next_part:
if not ep_found:
continue
break
if ep_num_list:
return current_id, [i['id'] for i in ep_info if i['sort'] in ep_num_list]
return current_id, _target_ep[0]['id']
return None, None if target_ep else None

def get_subject_collection(self, subject_id):
Expand Down
28 changes: 4 additions & 24 deletions utils/bangumi_sync.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,11 @@
import datetime
import os
import re

from utils.configs import configs, MyLogger
from utils.tools import ThreadWithReturnValue

logger = MyLogger()


def emby_bgm_season_date_check(emby_info, bgm_info):
emby_date = emby_info.get('PremiereDate', '')[:10]
bgm_date = bgm_info['date']
if not emby_date:
logger.info(f'bgm: emby season air date not found')
return False
emby_date = datetime.date.fromisoformat(emby_date)
bgm_date = datetime.date.fromisoformat(bgm_date)
diff = emby_date - bgm_date
if abs(diff.days) > 15:
logger.info(f'bgm: check {emby_date=} {bgm_date=} diff greater than 15')
return False
return True


def bangumi_sync(emby, bgm, emby_eps: list = None, emby_ids: list = None):
from utils.bangumi_api import BangumiApiEmbyVer
from utils.emby_api import EmbyApi
Expand Down Expand Up @@ -61,8 +44,6 @@ def bangumi_sync(emby, bgm, emby_eps: list = None, emby_ids: list = None):
if bgm.title_diff_ratio(title=emby_title, ori_title=ori_title, bgm_data=bgm_data) < 0.5:
logger.error('bgm: bgm_data not match, skip')
return
emby_se_info_t = ThreadWithReturnValue(target=emby.get_item, args=(item_info['SeasonId'],))
emby_se_info_t.start()

subject_id = bgm_data['id']
bgm_se_id, bgm_ep_ids = bgm.get_target_season_episode_id(
Expand All @@ -71,11 +52,10 @@ def bangumi_sync(emby, bgm, emby_eps: list = None, emby_ids: list = None):
logger.info(f'bgm: {subject_id=} {season_num=} {ep_nums=}, not exists or too big, skip')
return

emby_se_info = emby_se_info_t.join()
bgm_se_info = bgm.get_subject(bgm_se_id)
if not emby_bgm_season_date_check(emby_se_info, bgm_se_info):
logger.info(f'bgm: season_date_check failed, skip | https://bgm.tv/subject/{bgm_se_id}')
return
# bgm 同季第二部分的上映时间和 emby 的季上映时间对不上,故放弃。
# if not emby_bgm_season_date_check(emby_se_info, bgm_se_info):
# logger.info(f'bgm: season_date_check failed, skip)
# return

logger.info(f'bgm: get {bgm_data["name"]} S0{season_num}E{ep_nums} https://bgm.tv/subject/{bgm_se_id}')
for bgm_ep_id, ep_num in zip(bgm_ep_ids, ep_nums):
Expand Down

0 comments on commit d2fe3ea

Please sign in to comment.