From 85e5338121789f53c2d25c30968aa946a5264118 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 23 Jun 2024 18:40:44 +0800 Subject: [PATCH 1/9] =?UTF-8?q?fix=20#2340=20fix=20=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E5=88=AE=E5=89=8A=E5=9B=BE=E7=89=87=E4=B8=8D=E5=AE=8C=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/__init__.py | 2 +- app/chain/download.py | 7 ++++ app/chain/transfer.py | 82 +++++++++++++++++++++++-------------------- 3 files changed, 52 insertions(+), 39 deletions(-) diff --git a/app/chain/__init__.py b/app/chain/__init__.py index 43cc812e..6e6ebbe4 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -142,7 +142,7 @@ class ChainBase(metaclass=ABCMeta): bangumiid: int = None, cache: bool = True) -> Optional[MediaInfo]: """ - 识别媒体信息 + 识别媒体信息,不含Fanart图片 :param meta: 识别的元数据 :param mtype: 识别的媒体类型,与tmdbid配套 :param tmdbid: tmdbid diff --git a/app/chain/download.py b/app/chain/download.py index 38644ecc..037c0c7b 100644 --- a/app/chain/download.py +++ b/app/chain/download.py @@ -216,6 +216,13 @@ class DownloadChain(ChainBase): _media = context.media_info _meta = context.meta_info + # 补充完整的media数据 + if not _media.genre_ids: + new_media = self.recognize_media(mtype=_media.type, tmdbid=_media.tmdb_id, + doubanid=_media.douban_id, bangumiid=_media.bangumi_id) + if new_media: + _media = new_media + # 实际下载的集数 download_episodes = StringUtils.format_ep(list(episodes)) if episodes else None _folder_name = "" diff --git a/app/chain/transfer.py b/app/chain/transfer.py index ef510c75..42232a8e 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -86,13 +86,16 @@ class TransferChain(ChainBase): mediainfo = self.recognize_media(mtype=mtype, tmdbid=downloadhis.tmdbid, doubanid=downloadhis.doubanid) + if mediainfo: + # 补充图片 + self.obtain_images(mediainfo) else: # 非MoviePilot下载的任务,按文件识别 mediainfo = None # 执行转移 - self.do_transfer(storage="local", path=torrent.path, - mediainfo=mediainfo, download_hash=torrent.hash) + self.__do_transfer(storage="local", path=torrent.path, + mediainfo=mediainfo, download_hash=torrent.hash) # 设置下载任务状态 self.transfer_completed(hashs=torrent.hash, path=torrent.path) @@ -100,13 +103,13 @@ class TransferChain(ChainBase): logger.info("下载器文件转移执行完成") return True - def do_transfer(self, storage: str, path: Path, drive_id: str = None, fileid: str = None, filetype: str = None, - meta: MetaBase = None, mediainfo: MediaInfo = None, - download_hash: str = None, - target: Path = None, transfer_type: str = None, - season: int = None, epformat: EpisodeFormat = None, - min_filesize: int = 0, scrape: bool = None, - force: bool = False) -> Tuple[bool, str]: + def __do_transfer(self, storage: str, path: Path, drive_id: str = None, fileid: str = None, filetype: str = None, + meta: MetaBase = None, mediainfo: MediaInfo = None, + download_hash: str = None, + target: Path = None, transfer_type: str = None, + season: int = None, epformat: EpisodeFormat = None, + min_filesize: int = 0, scrape: bool = None, + force: bool = False) -> Tuple[bool, str]: """ 执行一个复杂目录的转移操作 :param storage: 存储器 @@ -152,7 +155,7 @@ class TransferChain(ChainBase): download_hash=download_hash, force=force) else: # 网盘整理 - result = self.__transfer_remote(storage=storage, + result = self.__transfer_online(storage=storage, fileitem=schemas.FileItem( path=str(path) + ("/" if filetype == "dir" else ""), type=filetype, @@ -467,7 +470,7 @@ class TransferChain(ChainBase): key=ProgressKey.FileTransfer) return True, "\n".join(err_msgs) - def __transfer_remote(self, storage: str, fileitem: schemas.FileItem, + def __transfer_online(self, storage: str, fileitem: schemas.FileItem, meta: MetaBase, mediainfo: MediaInfo) -> Tuple[bool, str]: """ 整理一个远程目录 @@ -535,7 +538,7 @@ class TransferChain(ChainBase): # 文件元数据 meta = MetaInfoPath(Path(fileitem.path)) if not mediainfo: - mediainfo = self.recognize_media(meta=meta) + mediainfo = self.mediachain.recognize_by_meta(meta) if not mediainfo: logger.warn(f"{fileitem.name} 未识别到媒体信息") return False, f"{fileitem.name} 未识别到媒体信息" @@ -589,12 +592,12 @@ class TransferChain(ChainBase): if not file_meta.name: # 过滤掉无效文件 continue - file_media = self.recognize_media(meta=file_meta) + file_media = self.mediachain.recognize_by_meta(file_meta) if not file_media: logger.warn(f"{file.name} 未识别到媒体信息") continue # 整理这个文件或目录 - self.__transfer_remote(storage=storage, fileitem=file, meta=file_meta, mediainfo=file_media) + self.__transfer_online(storage=storage, fileitem=file, meta=file_meta, mediainfo=file_media) else: # 电视剧目录 # 判断当前目录类型 @@ -661,12 +664,12 @@ class TransferChain(ChainBase): continue # 重新识别文件或目录 file_meta = MetaInfoPath(Path(file.path)) - file_media = self.recognize_media(meta=file_meta) + file_media = self.mediachain.recognize_by_meta(file_meta) if not file_media: logger.warn(f"{file.name} 未识别到媒体信息") continue # 整理这个文件或目录 - self.__transfer_remote(storage=storage, fileitem=file, meta=file_meta, mediainfo=file_media) + self.__transfer_online(storage=storage, fileitem=file, meta=file_meta, mediainfo=file_media) logger.info(f"{fileitem.path} 整理完成") self.progress.update(value=0, @@ -747,16 +750,16 @@ class TransferChain(ChainBase): if not type_str or type_str not in [MediaType.MOVIE.value, MediaType.TV.value]: args_error() return - state, errmsg = self.re_transfer(logid=int(logid), - mtype=MediaType(type_str), - mediaid=media_id) + state, errmsg = self.__re_transfer(logid=int(logid), + mtype=MediaType(type_str), + mediaid=media_id) if not state: self.post_message(Notification(channel=channel, title="手动整理失败", text=errmsg, userid=userid, link=settings.MP_DOMAIN('#/history'))) return - def re_transfer(self, logid: int, mtype: MediaType = None, - mediaid: str = None) -> Tuple[bool, str]: + def __re_transfer(self, logid: int, mtype: MediaType = None, + mediaid: str = None) -> Tuple[bool, str]: """ 根据历史记录,重新识别转移,只支持简单条件 :param logid: 历史记录ID @@ -791,11 +794,11 @@ class TransferChain(ChainBase): self.delete_files(Path(history.dest)) # 强制转移 - state, errmsg = self.do_transfer(storage="local", - path=src_path, - mediainfo=mediainfo, - download_hash=history.download_hash, - force=True) + state, errmsg = self.__do_transfer(storage="local", + path=src_path, + mediainfo=mediainfo, + download_hash=history.download_hash, + force=True) if not state: return False, errmsg @@ -843,13 +846,16 @@ class TransferChain(ChainBase): mediainfo: MediaInfo = self.mediachain.recognize_media(tmdbid=tmdbid, doubanid=doubanid, mtype=mtype) if not mediainfo: return False, f"媒体信息识别失败,tmdbid:{tmdbid},doubanid:{doubanid},type: {mtype.value}" + else: + # 更新媒体图片 + self.obtain_images(mediainfo=mediainfo) # 开始进度 self.progress.start(ProgressKey.FileTransfer) self.progress.update(value=0, text=f"开始转移 {in_path} ...", key=ProgressKey.FileTransfer) # 开始转移 - state, errmsg = self.do_transfer( + state, errmsg = self.__do_transfer( storage=storage, path=in_path, drive_id=drive_id, @@ -872,17 +878,17 @@ class TransferChain(ChainBase): return True, "" else: # 没有输入TMDBID时,按文件识别 - state, errmsg = self.do_transfer(storage=storage, - path=in_path, - drive_id=drive_id, - fileid=fileid, - filetype=filetype, - target=target, - transfer_type=transfer_type, - season=season, - epformat=epformat, - min_filesize=min_filesize, - force=force) + state, errmsg = self.__do_transfer(storage=storage, + path=in_path, + drive_id=drive_id, + fileid=fileid, + filetype=filetype, + target=target, + transfer_type=transfer_type, + season=season, + epformat=epformat, + min_filesize=min_filesize, + force=force) return state, errmsg def send_transfer_message(self, meta: MetaBase, mediainfo: MediaInfo, From e896068bc552f2fb06b1d155b7647143dba01a08 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 23 Jun 2024 18:48:13 +0800 Subject: [PATCH 2/9] fix #2400 --- app/api/endpoints/aliyun.py | 11 ++++++----- app/helper/aliyun.py | 12 ++++++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/api/endpoints/aliyun.py b/app/api/endpoints/aliyun.py index cb8ba05c..3354a31d 100644 --- a/app/api/endpoints/aliyun.py +++ b/app/api/endpoints/aliyun.py @@ -73,7 +73,7 @@ def list_aliyun(fileitem: schemas.FileItem, if sort == "time": sort = "updated_at" if fileitem.type == "file": - fileitem = AliyunHelper().detail(fileitem.fileid, path=path) + fileitem = AliyunHelper().detail(drive_id=fileitem.drive_id, file_id=fileitem.fileid, path=path) if fileitem: return [fileitem] return [] @@ -115,13 +115,14 @@ def delete_aliyun(fileitem: schemas.FileItem, @router.get("/download", summary="下载文件(阿里云盘)") def download_aliyun(fileid: str, + drive_id: str = None, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: """ 下载文件或目录 """ if not fileid: return schemas.Response(success=False) - url = AliyunHelper().download(fileid) + url = AliyunHelper().download(drive_id=drive_id, file_id=fileid) if url: # 重定向 return Response(status_code=302, headers={"Location": url}) @@ -138,7 +139,7 @@ def rename_aliyun(fileitem: schemas.FileItem, """ if not fileitem.fileid or not new_name: return schemas.Response(success=False) - result = AliyunHelper().rename(fileitem.fileid, new_name) + result = AliyunHelper().rename(drive_id=fileitem.drive_id, file_id=fileitem.fileid, name=new_name) if result: if recursive: transferchain = TransferChain() @@ -184,13 +185,13 @@ def rename_aliyun(fileitem: schemas.FileItem, @router.get("/image", summary="读取图片(阿里云盘)", response_model=schemas.Response) -def image_aliyun(fileid: str, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: +def image_aliyun(fileid: str, drive_id: str = None, _: schemas.TokenPayload = Depends(verify_uri_token)) -> Any: """ 读取图片 """ if not fileid: return schemas.Response(success=False) - url = AliyunHelper().download(fileid) + url = AliyunHelper().download(drive_id=drive_id, file_id=fileid) if url: # 重定向 return Response(status_code=302, headers={"Location": url}) diff --git a/app/helper/aliyun.py b/app/helper/aliyun.py index a2187669..190e46d5 100644 --- a/app/helper/aliyun.py +++ b/app/helper/aliyun.py @@ -456,7 +456,7 @@ class AliyunHelper: self.__handle_error(res, "删除文件") return False - def detail(self, file_id: str, path: str = "/") -> Optional[schemas.FileItem]: + def detail(self, drive_id: str, file_id: str, path: str = "/") -> Optional[schemas.FileItem]: """ 获取文件详情 """ @@ -465,7 +465,7 @@ class AliyunHelper: return None headers = self.__get_headers(params) res = RequestUtils(headers=headers, timeout=10).post_res(self.file_detail_url, json={ - "drive_id": params.get("resourceDriveId"), + "drive_id": drive_id, "file_id": file_id }) if res: @@ -486,7 +486,7 @@ class AliyunHelper: self.__handle_error(res, "获取文件详情") return None - def rename(self, file_id: str, name: str) -> bool: + def rename(self, drive_id: str, file_id: str, name: str) -> bool: """ 重命名文件 """ @@ -495,7 +495,7 @@ class AliyunHelper: return False headers = self.__get_headers(params) res = RequestUtils(headers=headers, timeout=10).post_res(self.rename_file_url, json={ - "drive_id": params.get("resourceDriveId"), + "drive_id": drive_id, "file_id": file_id, "name": name, "check_name_mode": "refuse" @@ -506,7 +506,7 @@ class AliyunHelper: self.__handle_error(res, "重命名文件") return False - def download(self, file_id: str) -> Optional[str]: + def download(self, drive_id: str, file_id: str) -> Optional[str]: """ 获取下载链接 """ @@ -515,7 +515,7 @@ class AliyunHelper: return None headers = self.__get_headers(params) res = RequestUtils(headers=headers, timeout=10).post_res(self.download_url, json={ - "drive_id": params.get("resourceDriveId"), + "drive_id": drive_id, "file_id": file_id }) if res: From 08a2b348d8fa90e09c5a7bb28b00c4e181fcce3b Mon Sep 17 00:00:00 2001 From: thsrite Date: Sun, 23 Jun 2024 19:45:08 +0800 Subject: [PATCH 3/9] add get_by_dest --- app/db/models/transferhistory.py | 5 +++++ app/db/transferhistory_oper.py | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/app/db/models/transferhistory.py b/app/db/models/transferhistory.py index 5868e8e9..e001431d 100644 --- a/app/db/models/transferhistory.py +++ b/app/db/models/transferhistory.py @@ -89,6 +89,11 @@ class TransferHistory(Base): def get_by_src(db: Session, src: str): return db.query(TransferHistory).filter(TransferHistory.src == src).first() + @staticmethod + @db_query + def get_by_dest(db: Session, dest: str): + return db.query(TransferHistory).filter(TransferHistory.dest == dest).first() + @staticmethod @db_query def list_by_hash(db: Session, download_hash: str): diff --git a/app/db/transferhistory_oper.py b/app/db/transferhistory_oper.py index eedac77a..add5be05 100644 --- a/app/db/transferhistory_oper.py +++ b/app/db/transferhistory_oper.py @@ -36,6 +36,13 @@ class TransferHistoryOper(DbOper): """ return TransferHistory.get_by_src(self._db, src) + def get_by_dest(self, dest: str) -> TransferHistory: + """ + 按转移路径查询转移记录 + :param dest: 数据key + """ + return TransferHistory.get_by_dest(self._db, dest) + def list_by_hash(self, download_hash: str) -> List[TransferHistory]: """ 按种子hash查询转移记录 From 2b0b190cf8fd28ed4fdc0e819d53d321210edf40 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 23 Jun 2024 19:46:36 +0800 Subject: [PATCH 4/9] fix bug --- app/chain/subscribe.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index b7bde055..5c80e5c6 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -1072,6 +1072,9 @@ class SubscribeChain(ChainBase): total = no_exist_season.total_episode # 原开始集数 start = no_exist_season.start_episode + # 整季缺失 + if not episode_list: + episode_list = list(range(start, total + 1)) # 更新剧集列表 episodes = list(set(episode_list).difference(set(downloaded_episodes))) # 更新集合 From 1edbfb0d2db4e8bb0aa382a8f2d46cf87280a8f4 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 24 Jun 2024 08:08:39 +0800 Subject: [PATCH 5/9] fix bug --- app/chain/transfer.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/chain/transfer.py b/app/chain/transfer.py index 42232a8e..bbd4dae0 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -487,12 +487,12 @@ class TransferChain(ChainBase): return U115Helper().list(parent_file_id=_fileid, path=_path) return [] - def __rename_file(_storage: str, _fileid: str, _name: str) -> bool: + def __rename_file(_storage: str, _deive_id: str, _fileid: str, _name: str) -> bool: """ 重命名文件 """ if _storage == "aliyun": - return AliyunHelper().rename(file_id=_fileid, name=_name) + return AliyunHelper().rename(drive_id=_deive_id, file_id=_fileid, name=_name) elif _storage == "u115": return U115Helper().rename(file_id=_fileid, name=_name) return False @@ -560,7 +560,7 @@ class TransferChain(ChainBase): if fileitem.type == "file": # 重命名文件 logger.info(f"正在整理 {fileitem.name} => {file_name} ...") - if not __rename_file(storage, fileitem.fileid, file_name): + if not __rename_file(_storage=storage, _deive_id=fileitem.drive_id, _fileid=fileitem.fileid, _name=file_name): logger.error(f"{fileitem.name} 重命名失败") return False, f"{fileitem.name} 重命名失败" logger.info(f"{fileitem.path} 整理完成") @@ -570,7 +570,8 @@ class TransferChain(ChainBase): # 电影目录 # 重命名当前目录 logger.info(f"正在重命名 {fileitem.path} => {folder_name} ...") - if not __rename_file(_storage=storage, _fileid=fileitem.fileid, _name=folder_name): + if not __rename_file(_storage=storage, _deive_id=fileitem.drive_id, + _fileid=fileitem.fileid, _name=folder_name): logger.error(f"{fileitem.path} 重命名失败") return False, f"{fileitem.path} 重命名失败" logger.info(f"{fileitem.path} 重命名完成") @@ -605,14 +606,16 @@ class TransferChain(ChainBase): if folder_meta.begin_season and not folder_meta.name: # 季目录 logger.info(f"正在重命名 {fileitem.path} => {season_name} ...") - if not __rename_file(_storage=storage, _fileid=fileitem.fileid, _name=season_name): + if not __rename_file(_storage=storage, _deive_id=fileitem.drive_id, + _fileid=fileitem.fileid, _name=season_name): logger.error(f"{fileitem.path} 重命名失败") return False, f"{fileitem.path} 重命名失败" logger.info(f"{fileitem.path} 重命名完成") elif folder_meta.name: # 根目录,重命名当前目录 logger.info(f"正在重命名 {fileitem.path} => {folder_name} ...") - if not __rename_file(_storage=storage, _fileid=fileitem.fileid, _name=folder_name): + if not __rename_file(_storage=storage, _deive_id=fileitem.drive_id, + _fileid=fileitem.fileid, _name=folder_name): logger.error(f"{fileitem.path} 重命名失败") return False, f"{fileitem.path} 重命名失败" logger.info(f"{fileitem.path} 重命名完成") From aeede861e35c26c5ca43e9e9cbc3cb9eea055909 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 24 Jun 2024 08:49:20 +0800 Subject: [PATCH 6/9] fix bug --- app/api/endpoints/media.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/api/endpoints/media.py b/app/api/endpoints/media.py index 048de65e..8a3925a6 100644 --- a/app/api/endpoints/media.py +++ b/app/api/endpoints/media.py @@ -110,7 +110,7 @@ def scrape(fileitem: schemas.FileItem, # 识别媒体信息 scrape_path = Path(fileitem.path) meta = MetaInfoPath(scrape_path) - mediainfo = chain.recognize_media(meta) + mediainfo = chain.recognize_by_meta(meta) if not media_info: return schemas.Response(success=False, message="刮削失败,无法识别媒体信息") if storage == "local": From 2536119f60ea90f286a5e6fc2f3f0914a072e370 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 24 Jun 2024 09:12:26 +0800 Subject: [PATCH 7/9] =?UTF-8?q?feat=EF=BC=9A=E7=BD=91=E7=9B=98=E6=95=B4?= =?UTF-8?q?=E7=90=86=E8=81=94=E5=8A=A8=E5=88=AE=E5=89=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/transfer.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/chain/transfer.py b/app/chain/transfer.py index bbd4dae0..cff9e4ca 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -165,7 +165,21 @@ class TransferChain(ChainBase): ), meta=meta, mediainfo=mediainfo) - + if result and result[0] and scrape: + # 刮削元数据 + self.progress.update(value=0, + text=f"正在刮削 {path} ...", + key=ProgressKey.FileTransfer) + self.mediachain.manual_scrape(storage=storage, + fileitem=schemas.FileItem( + path=str(path) + ("/" if filetype == "dir" else ""), + type=filetype, + drive_id=drive_id, + fileid=fileid, + name=path.name + ), + meta=meta, + mediainfo=mediainfo) # 结速进度 self.progress.end(ProgressKey.FileTransfer) return result From 3d0c06013dfc2a89c4bad2cc76dc6acbb449ba85 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 24 Jun 2024 09:37:11 +0800 Subject: [PATCH 8/9] fix bug --- app/chain/media.py | 7 ++++++- app/chain/transfer.py | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/chain/media.py b/app/chain/media.py index 323f550d..b2771884 100644 --- a/app/chain/media.py +++ b/app/chain/media.py @@ -334,7 +334,7 @@ class MediaChain(ChainBase, metaclass=Singleton): return None def manual_scrape(self, storage: str, fileitem: schemas.FileItem, - meta: MetaBase, mediainfo: MediaInfo, init_folder: bool = True): + meta: MetaBase = None, mediainfo: MediaInfo = None, init_folder: bool = True): """ 手动刮削媒体信息 """ @@ -399,7 +399,12 @@ class MediaChain(ChainBase, metaclass=Singleton): if fileitem.type == "file" \ and (not filepath.suffix or filepath.suffix.lower() not in settings.RMT_MEDIAEXT): return + if not meta: + meta = MetaInfoPath(filepath) if not mediainfo: + mediainfo = self.recognize_by_meta(meta) + if not mediainfo: + logger.warn(f"{filepath} 无法识别文件媒体信息!") return logger.info(f"开始刮削:{filepath} ...") if mediainfo.type == MediaType.MOVIE: diff --git a/app/chain/transfer.py b/app/chain/transfer.py index cff9e4ca..0f8a4ea6 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -905,6 +905,7 @@ class TransferChain(ChainBase): season=season, epformat=epformat, min_filesize=min_filesize, + scrape=scrape, force=force) return state, errmsg From 1dced579ea842a66bd1f1959571061f06ee4d30e Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 24 Jun 2024 12:41:59 +0800 Subject: [PATCH 9/9] Revert "fix bugs" --- .github/workflows/build.yml | 5 + app/core/config.py | 23 +++++ database/versions/06abf3e7090b_1_0_11.py | 30 ++++++ database/versions/127a25fdf0e8_1_0_13.py | 30 ++++++ database/versions/14f1813ae8e3_1_0_1.py | 31 ++++++ database/versions/1e169250e949_1_0_4.py | 30 ++++++ database/versions/232dfa044617_1_0_6.py | 38 ++++++++ database/versions/30329639c12b_1_0_7.py | 27 +++++ database/versions/52ab4930be04_1_0_3.py | 28 ++++++ database/versions/5813aaa7cb3a_1_0_15.py | 34 +++++++ database/versions/735c01e0453d_1_0_18.py | 31 ++++++ database/versions/9cb3993e340e_1_0_17.py | 30 ++++++ database/versions/9f4edd55c2d4_1_0_0.py | 32 ++++++ database/versions/a40261701909_1_0_20.py | 119 +++++++++++++++++++++++ database/versions/a521fbc28b18_1_0_9.py | 30 ++++++ database/versions/ae9d8ed8df97_1_0_19.py | 30 ++++++ database/versions/b2f011d3a8b7_1_0_8.py | 29 ++++++ database/versions/d146dea51516_1_0_16.py | 34 +++++++ database/versions/d633ca6cd572_1_0_10.py | 32 ++++++ database/versions/d71e624f0208_1_0_12.py | 30 ++++++ database/versions/e734c7fe6056_1_0_5.py | 27 +++++ database/versions/ec5fb51fc300_1_0_2.py | 32 ++++++ database/versions/f94cd1217fd7_1_0_14.py | 31 ++++++ version.py | 2 +- 24 files changed, 764 insertions(+), 1 deletion(-) create mode 100644 database/versions/06abf3e7090b_1_0_11.py create mode 100644 database/versions/127a25fdf0e8_1_0_13.py create mode 100644 database/versions/14f1813ae8e3_1_0_1.py create mode 100644 database/versions/1e169250e949_1_0_4.py create mode 100644 database/versions/232dfa044617_1_0_6.py create mode 100644 database/versions/30329639c12b_1_0_7.py create mode 100644 database/versions/52ab4930be04_1_0_3.py create mode 100644 database/versions/5813aaa7cb3a_1_0_15.py create mode 100644 database/versions/735c01e0453d_1_0_18.py create mode 100644 database/versions/9cb3993e340e_1_0_17.py create mode 100644 database/versions/9f4edd55c2d4_1_0_0.py create mode 100644 database/versions/a40261701909_1_0_20.py create mode 100644 database/versions/a521fbc28b18_1_0_9.py create mode 100644 database/versions/ae9d8ed8df97_1_0_19.py create mode 100644 database/versions/b2f011d3a8b7_1_0_8.py create mode 100644 database/versions/d146dea51516_1_0_16.py create mode 100644 database/versions/d633ca6cd572_1_0_10.py create mode 100644 database/versions/d71e624f0208_1_0_12.py create mode 100644 database/versions/e734c7fe6056_1_0_5.py create mode 100644 database/versions/ec5fb51fc300_1_0_2.py create mode 100644 database/versions/f94cd1217fd7_1_0_14.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 95379933..7a5a2a1a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,11 @@ name: MoviePilot Builder on: workflow_dispatch: + push: + branches: + - main + paths: + - version.py jobs: Docker-build: diff --git a/app/core/config.py b/app/core/config.py index d71aacb3..bbb745b4 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -241,6 +241,29 @@ class Settings(BaseSettings): # 服务器地址,对应 https://github.com/jxxghp/MoviePilot-Server 项目 MP_SERVER_HOST: str = "https://movie-pilot.org" + # 【已弃用】刮削入库的媒体文件 + SCRAP_METADATA: bool = True + # 【已弃用】下载保存目录,容器内映射路径需要一致 + DOWNLOAD_PATH: Optional[str] = None + # 【已弃用】电影下载保存目录,容器内映射路径需要一致 + DOWNLOAD_MOVIE_PATH: Optional[str] = None + # 【已弃用】电视剧下载保存目录,容器内映射路径需要一致 + DOWNLOAD_TV_PATH: Optional[str] = None + # 【已弃用】动漫下载保存目录,容器内映射路径需要一致 + DOWNLOAD_ANIME_PATH: Optional[str] = None + # 【已弃用】下载目录二级分类 + DOWNLOAD_CATEGORY: bool = False + # 【已弃用】媒体库目录,多个目录使用,分隔 + LIBRARY_PATH: Optional[str] = None + # 【已弃用】电影媒体库目录名 + LIBRARY_MOVIE_NAME: str = "电影" + # 【已弃用】电视剧媒体库目录名 + LIBRARY_TV_NAME: str = "电视剧" + # 【已弃用】动漫媒体库目录名,不设置时使用电视剧目录 + LIBRARY_ANIME_NAME: Optional[str] = None + # 【已弃用】二级分类 + LIBRARY_CATEGORY: bool = True + @validator("SUBSCRIBE_RSS_INTERVAL", "COOKIECLOUD_INTERVAL", "MEDIASERVER_SYNC_INTERVAL", diff --git a/database/versions/06abf3e7090b_1_0_11.py b/database/versions/06abf3e7090b_1_0_11.py new file mode 100644 index 00000000..ced8bf0f --- /dev/null +++ b/database/versions/06abf3e7090b_1_0_11.py @@ -0,0 +1,30 @@ +"""1.0.11 + +Revision ID: 06abf3e7090b +Revises: d633ca6cd572 +Create Date: 2023-10-27 12:22:56.213376 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '06abf3e7090b' +down_revision = 'd633ca6cd572' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("downloadhistory") as batch_op: + batch_op.add_column(sa.Column('username', sa.String, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/127a25fdf0e8_1_0_13.py b/database/versions/127a25fdf0e8_1_0_13.py new file mode 100644 index 00000000..f98dedfc --- /dev/null +++ b/database/versions/127a25fdf0e8_1_0_13.py @@ -0,0 +1,30 @@ +"""1.0.13 + +Revision ID: 127a25fdf0e8 +Revises: d71e624f0208 +Create Date: 2024-02-24 03:11:32.005540 + +""" + +import contextlib +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '127a25fdf0e8' +down_revision = 'd71e624f0208' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with contextlib.suppress(Exception): + with op.batch_alter_table("subscribe") as batch_op: + batch_op.add_column(sa.Column('search_imdbid', sa.Integer, nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/14f1813ae8e3_1_0_1.py b/database/versions/14f1813ae8e3_1_0_1.py new file mode 100644 index 00000000..eafdd2d3 --- /dev/null +++ b/database/versions/14f1813ae8e3_1_0_1.py @@ -0,0 +1,31 @@ +"""1.0.1 + +Revision ID: 14f1813ae8e3 +Revises: 9f4edd55c2d4 +Create Date: 2023-07-27 12:34:57.839443 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '14f1813ae8e3' +down_revision = '9f4edd55c2d4' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("subscribe") as batch_op: + batch_op.add_column(sa.Column('best_version', sa.Integer, nullable=True)) + batch_op.add_column(sa.Column('current_priority', sa.Integer, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/1e169250e949_1_0_4.py b/database/versions/1e169250e949_1_0_4.py new file mode 100644 index 00000000..6b5a9ebe --- /dev/null +++ b/database/versions/1e169250e949_1_0_4.py @@ -0,0 +1,30 @@ +"""1.0.4 + +Revision ID: 1e169250e949 +Revises: 52ab4930be04 +Create Date: 2023-09-01 09:56:33.907661 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1e169250e949' +down_revision = '52ab4930be04' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("subscribe") as batch_op: + batch_op.add_column(sa.Column('date', sa.String, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/232dfa044617_1_0_6.py b/database/versions/232dfa044617_1_0_6.py new file mode 100644 index 00000000..fe9f0ac1 --- /dev/null +++ b/database/versions/232dfa044617_1_0_6.py @@ -0,0 +1,38 @@ +"""1.0.6 + +Revision ID: 232dfa044617 +Revises: e734c7fe6056 +Create Date: 2023-09-19 21:34:41.994617 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = '232dfa044617' +down_revision = 'e734c7fe6056' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + # 搜索优先级 + op.execute("delete from systemconfig where key = 'SearchFilterRules';") + op.execute( + "insert into systemconfig(key, value) VALUES('SearchFilterRules', (select value from systemconfig where key= 'FilterRules'));") + # 订阅优先级 + op.execute("delete from systemconfig where key = 'SubscribeFilterRules';") + op.execute( + "insert into systemconfig(key, value) VALUES('SubscribeFilterRules', (select value from systemconfig where key= 'FilterRules'));") + # 洗版优先级 + op.execute("delete from systemconfig where key = 'BestVersionFilterRules';") + op.execute( + "insert into systemconfig(key, value) VALUES('BestVersionFilterRules', (select value from systemconfig where key= 'FilterRules2'));") + # 删除旧的优先级规则 + op.execute("delete from systemconfig where key = 'FilterRules';") + op.execute("delete from systemconfig where key = 'FilterRules2';") + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/30329639c12b_1_0_7.py b/database/versions/30329639c12b_1_0_7.py new file mode 100644 index 00000000..7006ec9e --- /dev/null +++ b/database/versions/30329639c12b_1_0_7.py @@ -0,0 +1,27 @@ +"""1.0.7 + +Revision ID: 30329639c12b +Revises: 232dfa044617 +Create Date: 2023-09-23 08:25:59.776488 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = '30329639c12b' +down_revision = '232dfa044617' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.execute("delete from systemconfig where key = 'DefaultFilterRules';") + op.execute( + "insert into systemconfig(key, value) VALUES('DefaultFilterRules', (select value from systemconfig where key= 'DefaultIncludeExcludeFilter'));") + op.execute("delete from systemconfig where key = 'DefaultIncludeExcludeFilter';") + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/52ab4930be04_1_0_3.py b/database/versions/52ab4930be04_1_0_3.py new file mode 100644 index 00000000..434a8f6f --- /dev/null +++ b/database/versions/52ab4930be04_1_0_3.py @@ -0,0 +1,28 @@ +"""1_0_3 + +Revision ID: 52ab4930be04 +Revises: ec5fb51fc300 +Create Date: 2023-08-28 13:21:45.152012 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = '52ab4930be04' +down_revision = 'ec5fb51fc300' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.execute("delete from systemconfig where key = 'RssSites';") + op.execute("insert into systemconfig(key, value) VALUES('RssSites', (select value from systemconfig where key= 'IndexerSites'));") + op.execute("delete from systemconfig where key = 'SearchResults';") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/database/versions/5813aaa7cb3a_1_0_15.py b/database/versions/5813aaa7cb3a_1_0_15.py new file mode 100644 index 00000000..35302687 --- /dev/null +++ b/database/versions/5813aaa7cb3a_1_0_15.py @@ -0,0 +1,34 @@ +"""1.0.15 + +Revision ID: 5813aaa7cb3a +Revises: f94cd1217fd7 +Create Date: 2024-03-17 09:04:51.785716 + +""" +import contextlib + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '5813aaa7cb3a' +down_revision = 'f94cd1217fd7' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with contextlib.suppress(Exception): + with op.batch_alter_table("message") as batch_op: + batch_op.add_column(sa.Column('note', sa.String, nullable=True)) + try: + op.create_index('ix_message_reg_time', 'message', ['reg_time'], unique=False) + except Exception as err: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/735c01e0453d_1_0_18.py b/database/versions/735c01e0453d_1_0_18.py new file mode 100644 index 00000000..999974f7 --- /dev/null +++ b/database/versions/735c01e0453d_1_0_18.py @@ -0,0 +1,31 @@ +"""1.0.18 + +Revision ID: 735c01e0453d +Revises: 9cb3993e340e +Create Date: 2024-04-29 19:40:38.375072 + +""" +import contextlib + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '735c01e0453d' +down_revision = '9cb3993e340e' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with contextlib.suppress(Exception): + with op.batch_alter_table("site") as batch_op: + batch_op.add_column(sa.Column('apikey', sa.VARCHAR)) + batch_op.add_column(sa.Column('token', sa.VARCHAR)) + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/9cb3993e340e_1_0_17.py b/database/versions/9cb3993e340e_1_0_17.py new file mode 100644 index 00000000..48d92fe5 --- /dev/null +++ b/database/versions/9cb3993e340e_1_0_17.py @@ -0,0 +1,30 @@ +"""1_0_17 + +Revision ID: 9cb3993e340e +Revises: d146dea51516 +Create Date: 2024-03-28 14:36:35.588392 + +""" +import contextlib + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '9cb3993e340e' +down_revision = 'd146dea51516' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with contextlib.suppress(Exception): + with op.batch_alter_table("user") as batch_op: + batch_op.add_column(sa.Column('is_otp', sa.BOOLEAN, server_default='0')) + batch_op.add_column(sa.Column('otp_secret', sa.VARCHAR)) + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/9f4edd55c2d4_1_0_0.py b/database/versions/9f4edd55c2d4_1_0_0.py new file mode 100644 index 00000000..6c29aaea --- /dev/null +++ b/database/versions/9f4edd55c2d4_1_0_0.py @@ -0,0 +1,32 @@ +"""1.0.0 + +Revision ID: 9f4edd55c2d4 +Revises: +Create Date: 2023-07-13 12:27:26.402317 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9f4edd55c2d4' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("subscribe") as batch_op: + batch_op.add_column(sa.Column('sites', sa.Text, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/database/versions/a40261701909_1_0_20.py b/database/versions/a40261701909_1_0_20.py new file mode 100644 index 00000000..f6812f00 --- /dev/null +++ b/database/versions/a40261701909_1_0_20.py @@ -0,0 +1,119 @@ +"""1.0.20 + +Revision ID: a40261701909 +Revises: ae9d8ed8df97 +Create Date: 2024-05-22 19:16:21.374806 + +""" +import json +from pathlib import Path + +from alembic import op +import sqlalchemy as sa + +from app.core.config import Settings + +# revision identifiers, used by Alembic. +revision = 'a40261701909' +down_revision = 'ae9d8ed8df97' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + """ + 升级目录配置 + """ + # 实例化配置 + _settings = Settings( + _env_file=Settings().CONFIG_PATH / "app.env", + _env_file_encoding="utf-8" + ) + # 下载目录配置升级 + download_dirs = [] + if _settings.DOWNLOAD_MOVIE_PATH: + download_dirs.append({ + "type": "download", + "name": "电影目录", + "path": _settings.DOWNLOAD_MOVIE_PATH, + "media_type": "电影", + "category": "", + "auto_category": True if _settings.DOWNLOAD_CATEGORY else False, + "priority": 1 + }) + if _settings.DOWNLOAD_TV_PATH: + download_dirs.append({ + "type": "download", + "name": "电视剧目录", + "path": _settings.DOWNLOAD_TV_PATH, + "media_type": "电视剧", + "category": "", + "auto_category": True if _settings.DOWNLOAD_CATEGORY else False, + "priority": 2 + }) + if _settings.DOWNLOAD_PATH: + download_dirs.append({ + "type": "download", + "name": "下载目录", + "path": _settings.DOWNLOAD_PATH, + "media_type": "", + "category": "", + "auto_category": True if _settings.DOWNLOAD_CATEGORY else False, + "priority": 4 + }) + + # 插入数据库,报错的话则更新 + if download_dirs: + download_dirs_value = json.dumps(download_dirs) + try: + op.execute(f"INSERT INTO systemconfig (key, value) VALUES ('DownloadDirectories', '{download_dirs_value}');") + except Exception as e: + op.execute(f"UPDATE systemconfig SET value = '{download_dirs_value}' WHERE key = 'DownloadDirectories';") + + # 媒体库目录配置升级 + library_dirs = [] + if _settings.LIBRARY_PATH: + for library_path in _settings.LIBRARY_PATH.split(","): + if _settings.LIBRARY_MOVIE_NAME: + library_dirs.append({ + "type": "library", + "name": "电影目录", + "path": str(Path(library_path) / _settings.LIBRARY_MOVIE_NAME), + "media_type": "电影", + "category": "", + "auto_category": True if _settings.LIBRARY_CATEGORY else False, + "scrape": True if _settings.SCRAP_METADATA else False, + "priority": 1 + }) + if _settings.LIBRARY_TV_NAME: + library_dirs.append({ + "type": "library", + "name": "电视剧目录", + "path": str(Path(library_path) / _settings.LIBRARY_TV_NAME), + "media_type": "电视剧", + "category": "", + "auto_category": True if _settings.LIBRARY_CATEGORY else False, + "scrape": True if _settings.SCRAP_METADATA else False, + "priority": 2 + }) + library_dirs.append({ + "type": "library", + "name": "媒体库目录", + "path": library_path, + "media_type": "", + "category": "", + "auto_category": True if _settings.LIBRARY_CATEGORY else False, + "scrape": True if _settings.SCRAP_METADATA else False, + "priority": 4 + }) + # 插入数据库,报错的话则更新 + if library_dirs: + library_dirs_value = json.dumps(library_dirs) + try: + op.execute(f"INSERT INTO systemconfig (key, value) VALUES ('LibraryDirectories', '{library_dirs_value}');") + except Exception as e: + op.execute(f"UPDATE systemconfig SET value = '{library_dirs_value}' WHERE key = 'LibraryDirectories';") + + +def downgrade() -> None: + pass diff --git a/database/versions/a521fbc28b18_1_0_9.py b/database/versions/a521fbc28b18_1_0_9.py new file mode 100644 index 00000000..361d2a98 --- /dev/null +++ b/database/versions/a521fbc28b18_1_0_9.py @@ -0,0 +1,30 @@ +"""1_0_9 + +Revision ID: a521fbc28b18 +Revises: b2f011d3a8b7 +Create Date: 2023-09-28 13:37:16.479360 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'a521fbc28b18' +down_revision = 'b2f011d3a8b7' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("downloadhistory") as batch_op: + batch_op.add_column(sa.Column('date', sa.String, nullable=True)) + batch_op.add_column(sa.Column('channel', sa.String, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/ae9d8ed8df97_1_0_19.py b/database/versions/ae9d8ed8df97_1_0_19.py new file mode 100644 index 00000000..78df9f12 --- /dev/null +++ b/database/versions/ae9d8ed8df97_1_0_19.py @@ -0,0 +1,30 @@ +"""1.0.19 + +Revision ID: ae9d8ed8df97 +Revises: 735c01e0453d +Create Date: 2024-05-16 14:21:46.108359 + +""" +import contextlib + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ae9d8ed8df97' +down_revision = '735c01e0453d' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with contextlib.suppress(Exception): + with op.batch_alter_table("site") as batch_op: + batch_op.add_column(sa.Column('timeout', sa.INTEGER)) + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/b2f011d3a8b7_1_0_8.py b/database/versions/b2f011d3a8b7_1_0_8.py new file mode 100644 index 00000000..37a36415 --- /dev/null +++ b/database/versions/b2f011d3a8b7_1_0_8.py @@ -0,0 +1,29 @@ +"""1_0_8 + +Revision ID: b2f011d3a8b7 +Revises: 30329639c12b +Create Date: 2023-09-28 10:15:58.410003 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'b2f011d3a8b7' +down_revision = '30329639c12b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("downloadhistory") as batch_op: + batch_op.add_column(sa.Column('userid', sa.String, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/d146dea51516_1_0_16.py b/database/versions/d146dea51516_1_0_16.py new file mode 100644 index 00000000..70f7408e --- /dev/null +++ b/database/versions/d146dea51516_1_0_16.py @@ -0,0 +1,34 @@ +"""1.0.16 + +Revision ID: d146dea51516 +Revises: 5813aaa7cb3a +Create Date: 2024-03-18 18:13:38.099531 + +""" +import contextlib + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'd146dea51516' +down_revision = '5813aaa7cb3a' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with contextlib.suppress(Exception): + with op.batch_alter_table("subscribe") as batch_op: + batch_op.add_column(sa.Column('bangumiid', sa.Integer, nullable=True)) + try: + op.create_index('ix_subscribe_bangumiid', 'subscribe', ['bangumiid'], unique=False) + except Exception as err: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/d633ca6cd572_1_0_10.py b/database/versions/d633ca6cd572_1_0_10.py new file mode 100644 index 00000000..044a8356 --- /dev/null +++ b/database/versions/d633ca6cd572_1_0_10.py @@ -0,0 +1,32 @@ +"""1.0.10 + +Revision ID: d633ca6cd572 +Revises: a521fbc28b18 +Create Date: 2023-10-12 08:54:49.728638 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'd633ca6cd572' +down_revision = 'a521fbc28b18' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("subscribe") as batch_op: + batch_op.add_column(sa.Column('quality', sa.String, nullable=True)) + batch_op.add_column(sa.Column('resolution', sa.String, nullable=True)) + batch_op.add_column(sa.Column('effect', sa.String, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/d71e624f0208_1_0_12.py b/database/versions/d71e624f0208_1_0_12.py new file mode 100644 index 00000000..897f6a66 --- /dev/null +++ b/database/versions/d71e624f0208_1_0_12.py @@ -0,0 +1,30 @@ +"""1_0_12 + +Revision ID: d71e624f0208 +Revises: 06abf3e7090b +Create Date: 2023-12-12 13:26:34.039497 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'd71e624f0208' +down_revision = '06abf3e7090b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("subscribe") as batch_op: + batch_op.add_column(sa.Column('save_path', sa.String, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/e734c7fe6056_1_0_5.py b/database/versions/e734c7fe6056_1_0_5.py new file mode 100644 index 00000000..78992168 --- /dev/null +++ b/database/versions/e734c7fe6056_1_0_5.py @@ -0,0 +1,27 @@ +"""1.0.5 + +Revision ID: e734c7fe6056 +Revises: 1e169250e949 +Create Date: 2023-09-07 18:19:41.250957 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = 'e734c7fe6056' +down_revision = '1e169250e949' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + op.create_index('ix_transferhistory_tmdbid', 'transferhistory', ['tmdbid'], unique=False) + except Exception as err: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/ec5fb51fc300_1_0_2.py b/database/versions/ec5fb51fc300_1_0_2.py new file mode 100644 index 00000000..5be86bc7 --- /dev/null +++ b/database/versions/ec5fb51fc300_1_0_2.py @@ -0,0 +1,32 @@ +"""1.0.2 + +Revision ID: ec5fb51fc300 +Revises: 14f1813ae8e3 +Create Date: 2023-08-12 17:55:06.509548 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ec5fb51fc300' +down_revision = '14f1813ae8e3' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + try: + with op.batch_alter_table("transferhistory") as batch_op: + batch_op.add_column(sa.Column('files', sa.String, nullable=True)) + with op.batch_alter_table("rss") as batch_op: + batch_op.add_column(sa.Column('filter', sa.Integer, nullable=True)) + except Exception as e: + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + pass diff --git a/database/versions/f94cd1217fd7_1_0_14.py b/database/versions/f94cd1217fd7_1_0_14.py new file mode 100644 index 00000000..28749801 --- /dev/null +++ b/database/versions/f94cd1217fd7_1_0_14.py @@ -0,0 +1,31 @@ +"""1_0_14 + +Revision ID: f94cd1217fd7 +Revises: 127a25fdf0e8 +Create Date: 2024-03-06 19:19:33.053186 + +""" +import contextlib + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'f94cd1217fd7' +down_revision = '127a25fdf0e8' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with contextlib.suppress(Exception): + with op.batch_alter_table("subscribe") as batch_op: + batch_op.add_column(sa.Column('manual_total_episode', sa.Integer, nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass diff --git a/version.py b/version.py index 02d6855c..4551da43 100644 --- a/version.py +++ b/version.py @@ -1 +1 @@ -APP_VERSION = 'v2.0.0-alpha' +APP_VERSION = 'v1.9.8-beta'