def __scan_current_on_air_bangumi(self):
logger.info('start scan info of episode')
session = SessionManager.Session()
try:
result = session.query(Episode, Bangumi). \
join(Bangumi). \
filter(Bangumi.delete_mark == None). \
filter(Bangumi.status != Bangumi.STATUS_FINISHED)
bgm_episode_dict = {}
for episode, bangumi in result:
# check terminated state to response instantly.
if self.terminated:
return
if not (bangumi.bgm_id in bgm_episode_dict):
# if this is not the first call for get_bgm_info,
# a delay should be added to prevent access the bgm api
# too frequently
if bgm_episode_dict:
time.sleep(20)
logger.info('try to get info for bangumi of %s' % str(bangumi.bgm_id))
(status_code, bangumi_info) = self.get_bgm_info(bangumi.bgm_id)
if status_code < 400:
bgm_episode_dict[bangumi.bgm_id] = bangumi_info
if not (bangumi.bgm_id in bgm_episode_dict):
continue
bangumi_info = bgm_episode_dict[bangumi.bgm_id]
for eps in bangumi_info['eps']:
if eps['id'] == episode.bgm_eps_id:
if episode.name == '':
episode.name = eps['name']
if episode.name_cn == '':
episode.name_cn = eps['name_cn']
if episode.duration == '':
episode.duration = eps['duration']
# always update airdate because it can be changed.
if is_valid_date(eps['airdate']):
episode.airdate = eps['airdate']
break
session.commit()
logger.info('scan finished, will scan at next day')
except exc.DBAPIError as db_error:
logger.error(db_error, exc_info=True)
# if connection is invalid rollback the session
if db_error.connection_invalidated:
session.rollback()
except Exception as error:
logger.error(error, exc_info=True)
traceback.print_exc()
finally:
SessionManager.Session.remove()
评论列表
文章目录