modify scripts
This commit is contained in:
@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user