modify scripts

This commit is contained in:
oscarz
2025-06-24 19:03:44 +08:00
parent c5feab2c22
commit 7e14a5f247
4 changed files with 610 additions and 226 deletions

View File

@ -118,6 +118,11 @@ class DatabaseHandler:
logging.error(f"Error inserting or updating data: {e}")
return None
def get_id_by_key(self, tbl, uniq_key, val):
self.cursor.execute(f"SELECT id FROM {tbl} WHERE {uniq_key} = ?", (val,))
row = self.cursor.fetchone()
return row[0] if row else None
def insert_task_log(self):
return 1
@ -137,20 +142,62 @@ class JavbusDBHandler(DatabaseHandler):
def __init__(self, db_path=None):
super().__init__(db_path)
self.tbl_name_actors = 'javbus_actors'
self.tbl_name_movies = 'javbus_movies'
self.tbl_name_studios = 'javbus_studios'
self.tbl_name_labels = 'javbus_labels'
self.tbl_name_series = 'javbus_series'
self.tbl_name_tags = 'javbus_tags'
self.tbl_name_movie_tags = 'javbus_movies_tags'
self.tbl_name_actor_movie = 'javbus_actors_movies'
def insert_actor_index(self, data, **kwargs):
fields = ['uncensored', 'from_actor_list', 'from_movie_list']
# 如果没有传入值,就用原来的值
for field in fields:
if kwargs.get(field) is not None:
data[field] = kwargs.get(field)
def insert_actor_index(self, data, uncensored=0, from_actor_list=0, from_movie_list=0):
data['uncensored'] = uncensored
if from_actor_list:
data['from_actor_list'] = from_actor_list
if from_movie_list:
data['from_movie_list'] = from_movie_list
try:
return self.insert_or_update_common(data, self.tbl_name_actors, uniq_key='href')
except sqlite3.Error as e:
logging.error(f"Error inserting or updating data: {e}")
return None
def update_actor_detail(self, data, is_full_data=1):
def insert_movie_index(self, data, **kwargs):
fields = ['uncensored', 'from_actor_list', 'from_movie_studios', 'from_movie_labels', 'from_movie_series']
# 如果没有传入值,就用原来的值
for field in fields:
if kwargs.get(field) is not None:
data[field] = kwargs.get(field)
try:
return self.insert_or_update_common(data, self.tbl_name_movies, uniq_key='href')
except sqlite3.Error as e:
logging.error(f"Error inserting or updating data: {e}")
return None
# 插入演员和电影的关联数据
def insert_actor_movie(self, performer_id, movie_id, tags=''):
try:
self.cursor.execute("""
INSERT INTO javbus_actors_movies (actor_id, movie_id, tags, updated_at)
VALUES (?, ?, ?, datetime('now', 'localtime'))
ON CONFLICT(actor_id, movie_id) DO UPDATE SET tags=excluded.tags, updated_at=datetime('now', 'localtime')
""",
(performer_id, movie_id, tags)
)
self.conn.commit()
#logging.debug(f'insert one performer_movie, performer_id: {performer_id}, movie_id: {movie_id}')
return performer_id
except Exception as e:
self.conn.rollback()
logging.error("Error inserting movie: %s", e)
return None
def update_actor_detail_404(self, data, is_full_data=1):
try:
data['is_full_data'] = is_full_data
return self.insert_or_update_common(data, self.tbl_name_actors, uniq_key='href')
@ -158,17 +205,49 @@ class JavbusDBHandler(DatabaseHandler):
logging.error(f"Error inserting or updating data: {e}")
return None
def update_actor_detail(self, data, is_full_data=1):
try:
# 跟新actor表
if data.get('avatar') is not None:
avatar = data.get('avatar', {})
avatar['href'] = data['href']
avatar['is_full_data'] = is_full_data
avatar_id = self.insert_or_update_common(avatar, self.tbl_name_actors, uniq_key='href')
logging.debug(f"update actor data. data: {avatar}")
else:
avatar_id = self.get_id_by_key(self.tbl_name_actors, 'href', data.get('href', ''))
if not avatar_id:
logging.warning(f"get actor id error. href: {data['href']}")
return None
# 更新movies表
uncensored = data.get('uncensored', 0)
for movie in data.get('credits', []):
movie_id = self.insert_movie_index(movie, from_actor_list=1, uncensored=uncensored)
if movie_id:
logging.debug(f"insert one movie index. data: {movie}")
# 插入关系表
link_id = self.insert_actor_movie(avatar_id, movie_id)
if link_id:
logging.debug(f"insert one actor_movie record. actor id: {avatar_id}, movie id: {movie_id}")
return avatar_id
except sqlite3.Error as e:
logging.error(f"Error inserting or updating data: {e}")
return None
def query_actors(self, **filters):
try:
sql = f"SELECT url, en_name as name FROM {self.tbl_name_actors} WHERE 1=1"
sql = f"SELECT href, en_name as name, uncensored FROM {self.tbl_name_actors} WHERE 1=1"
params = []
conditions = {
"id": " AND id = ?",
"url": " AND href = ?",
"en_name": " AND name LIKE ?",
"href": " AND href = ?",
"en_name": " AND en_name LIKE ?",
"is_full_data": " AND is_full_data = ?",
"start_id": " AND id > ?",
"uncensored": " AND uncensored = ?",
}
for key, condition in conditions.items():
@ -197,8 +276,157 @@ class JavbusDBHandler(DatabaseHandler):
params.append(filters["limit"])
self.cursor.execute(sql, params)
return [{'url': row[0], 'name': row[1]} for row in self.cursor.fetchall()]
return [{'href': row[0], 'name': row[1], 'uncensored': row[2]} for row in self.cursor.fetchall()]
except sqlite3.Error as e:
logging.error(f"查询 href 失败: {e}")
return None
def query_movies(self, **filters):
try:
sql = f"SELECT href, title, uncensored, id FROM {self.tbl_name_movies} WHERE 1=1"
params = []
conditions = {
"id": " AND id = ?",
"href": " AND href = ?",
"title": " AND title LIKE ?",
"is_full_data": " AND is_full_data = ?",
"start_id": " AND id > ?",
"uncensored": " AND uncensored = ?",
}
for key, condition in conditions.items():
if key in filters:
sql += condition
if key == "title":
params.append(f"%{filters[key]}%")
else:
params.append(filters[key])
for key in ["is_full_data_in", "is_full_data_not_in"]:
if key in filters:
values = filters[key]
if values:
placeholders = ", ".join(["?"] * len(values))
operator = "IN" if key == "is_full_data_in" else "NOT IN"
sql += f" AND is_full_data {operator} ({placeholders})"
params.extend(values)
if "order_by" in filters:
# 注意:这里 order by 后面直接跟字段名,不能用占位符,否则会被当作字符串处理
sql += f" ORDER BY {filters['order_by']} "
if 'limit' in filters:
sql += " LIMIT ?"
params.append(filters["limit"])
self.cursor.execute(sql, params)
return [{'href': row[0], 'title': row[1], 'uncensored': row[2], 'id':row[3]} for row in self.cursor.fetchall()]
except sqlite3.Error as e:
logging.error(f"查询 href 失败: {e}")
return None
# 检查记录是否存在,不存在就插入
def check_and_get_id(self, item, uncensored, tbl, uniq_key='href'):
name = item['name']
href = item['href']
row_id = self.get_id_by_key(tbl, uniq_key, href)
if row_id is None:
row_id = self.insert_or_update_common({'name':name, 'href': href, 'uncensored':uncensored, 'from_movie_list':1}, tbl_name=tbl, uniq_key=uniq_key)
return row_id
def insert_or_update_tags(self, data, uniq_key='href'):
return self.insert_or_update_common(data, self.tbl_name_tags, uniq_key)
def insert_movie_tags(self, movie_id, tag_id, tags):
try:
self.cursor.execute("""
INSERT INTO javbus_movies_tags (movie_id, tag_id, tags, updated_at)
VALUES (?, ?, ?, datetime('now', 'localtime'))
ON CONFLICT(tag_id, movie_id) DO UPDATE SET tags=excluded.tags, updated_at=datetime('now', 'localtime')
""",
(movie_id, tag_id, tags)
)
self.conn.commit()
#logging.debug(f'insert one performer_movie, performer_id: {performer_id}, movie_id: {movie_id}')
return movie_id
except Exception as e:
self.conn.rollback()
logging.error("Error inserting movie: %s", e)
return None
def insert_or_update_movie_404(self, data, is_full_data=1):
try:
data['is_full_data'] = is_full_data
return self.insert_or_update_common(data, self.tbl_name_movies, uniq_key='href')
except sqlite3.Error as e:
logging.error(f"Error inserting or updating data: {e}")
return None
# """插入或更新电影数据"""
def insert_or_update_movie(self, movie, is_full_data=1):
try:
# 获取相关 ID
studio_id = self.check_and_get_id(movie.get('studio'), movie.get('uncensored', 0), self.tbl_name_studios) if movie.get('studio') is not None else None
label_id = self.check_and_get_id(movie.get('label'), movie.get('uncensored', 0), self.tbl_name_labels) if movie.get('label') is not None else None
series_id = self.check_and_get_id(movie.get('series'), movie.get('uncensored', 0), self.tbl_name_series) if movie.get('series') is not None else None
if studio_id:
movie['studio_id'] = studio_id
if label_id:
movie['label_id'] = label_id
if series_id:
movie['series_id'] = series_id
movie['is_full_data'] = is_full_data
movie['actors_cnt'] = len(movie.get('actors', []))
movie_id = self.insert_or_update_common(movie, self.tbl_name_movies, uniq_key='href')
if movie_id is None:
logging.warning(f"insert/update movie error. data:{movie}")
return None
logging.debug(f"insert one move, id: {movie_id}, title: {movie['title']}, href: {movie['href']}")
# 插入 performers_movies 关系表
for performer in movie.get('actors', []):
performer_id = self.get_id_by_key(self.tbl_name_actors, 'href', performer['href'])
# 如果演员不存在,先插入
if performer_id is None:
performer_id = self.insert_actor_index(performer['name'], performer['href'], from_movie_list=1)
logging.debug(f"insert new perfomer. perfomer_id: {performer_id}, name:{performer['name']}")
if performer_id:
tmp_id = self.insert_actor_movie(performer_id, movie_id)
if tmp_id:
logging.debug(f"insert one perfomer_movie. perfomer_id: {performer_id}, movie_id:{movie_id}")
else:
logging.debug(f"insert perfomer_movie failed. perfomer_id: {performer_id}, movie_id:{movie_id}")
else:
logging.warning(f"insert perfomer failed. name: {performer['name']}, href: {performer['href']}")
# 插入 tags 表
for tag in movie.get('tags', []):
tag_name = tag.get('name', '')
tag_href = tag.get('href', '')
tag_id = self.insert_or_update_tags({'name':tag_name, 'href':tag_href}, uniq_key='href')
if tag_id:
logging.debug(f"insert one tags. tag_id: {tag_id}, name: {tag_name}")
tmp_id = self.insert_movie_tags(movie_id=movie_id, tag_id=tag_id, tags=tag_name)
if tmp_id:
logging.debug(f"insert one movie_tag. movie_id: {movie_id}, tag_id: {tag_id}, name: {tag_name}")
else:
logging.warning(f"insert one movie_tag error. movie_id: {movie_id}, tag_id: {tag_id}, name: {tag_name}")
else:
logging.warning(f"insert tags error. name:{tag_name}, href: {tag_href}")
return movie_id
except Exception as e:
self.conn.rollback()
logging.error("Error inserting movie: %s", e)
return None