mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-06-03 14:39:56 +08:00
fix: preserve tv bluray disc folders (#5788)
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
from pathlib import Path
|
||||
import sys
|
||||
from types import ModuleType
|
||||
|
||||
sys.modules.setdefault("app.helper.sites", ModuleType("app.helper.sites"))
|
||||
setattr(sys.modules["app.helper.sites"], "SitesHelper", object)
|
||||
|
||||
from app.core.context import MediaInfo
|
||||
from app.core.metainfo import MetaInfoPath
|
||||
from app.core.meta import MetaBase
|
||||
from app.modules.filemanager import FileManagerModule
|
||||
from app.schemas import FileItem, TransferDirectoryConf
|
||||
from app.schemas.types import MediaType
|
||||
@@ -31,6 +36,23 @@ class GuardedStorage:
|
||||
raise AssertionError("预览不应删除文件")
|
||||
|
||||
|
||||
def _build_meta(
|
||||
title: str,
|
||||
media_type: MediaType = MediaType.TV,
|
||||
season: int = 1,
|
||||
episode: int = 1,
|
||||
part: str = None,
|
||||
):
|
||||
meta = MetaBase(title)
|
||||
meta.type = media_type
|
||||
meta.name = "Breaking Bad" if media_type == MediaType.TV else "Test Movie"
|
||||
meta.year = "2008" if media_type == MediaType.TV else "2026"
|
||||
meta.begin_season = season
|
||||
meta.begin_episode = episode
|
||||
meta.part = part
|
||||
return meta
|
||||
|
||||
|
||||
def test_cloud_storage_preview_only_calculates_target_path():
|
||||
fileitem = FileItem(
|
||||
storage="alist",
|
||||
@@ -41,7 +63,7 @@ def test_cloud_storage_preview_only_calculates_target_path():
|
||||
extension="mkv",
|
||||
size=1024,
|
||||
)
|
||||
meta = MetaInfoPath(Path(fileitem.path))
|
||||
meta = _build_meta("Test.Show.S01E01.mkv", season=1, episode=1)
|
||||
mediainfo = MediaInfo(
|
||||
type=MediaType.TV,
|
||||
title="Test Show",
|
||||
@@ -94,7 +116,7 @@ def test_local_storage_preview_skips_target_conflict_checks(tmp_path):
|
||||
extension="mkv",
|
||||
size=source_file.stat().st_size,
|
||||
)
|
||||
meta = MetaInfoPath(source_file)
|
||||
meta = _build_meta(source_file.name, season=1, episode=2)
|
||||
mediainfo = MediaInfo(
|
||||
type=MediaType.TV,
|
||||
title="Test Show",
|
||||
@@ -131,3 +153,99 @@ def test_local_storage_preview_skips_target_conflict_checks(tmp_path):
|
||||
assert transferinfo.target_item.path.endswith(".mkv")
|
||||
assert transferinfo.file_list == [fileitem.path]
|
||||
assert transferinfo.file_list_new == [transferinfo.target_item.path]
|
||||
|
||||
|
||||
def _build_bluray_dir_preview(
|
||||
source_name: str,
|
||||
media_type: MediaType,
|
||||
season: int = None,
|
||||
part: str = None,
|
||||
):
|
||||
fileitem = FileItem(
|
||||
storage="alist",
|
||||
path=f"/downloads/{source_name}",
|
||||
type="dir",
|
||||
name=source_name,
|
||||
basename=source_name,
|
||||
)
|
||||
meta = _build_meta(
|
||||
fileitem.name,
|
||||
media_type=media_type,
|
||||
season=season,
|
||||
episode=None,
|
||||
part=part,
|
||||
)
|
||||
mediainfo = MediaInfo(
|
||||
type=media_type,
|
||||
title="Breaking Bad" if media_type == MediaType.TV else "Test Movie",
|
||||
year="2008" if media_type == MediaType.TV else "2026",
|
||||
tmdb_id=1396,
|
||||
)
|
||||
target_directory = TransferDirectoryConf(
|
||||
name="cloud-library",
|
||||
transfer_type="copy",
|
||||
overwrite_mode="never",
|
||||
library_path="/library",
|
||||
library_storage="alist",
|
||||
renaming=True,
|
||||
scraping=True,
|
||||
notify=True,
|
||||
)
|
||||
|
||||
return FileManagerModule().transfer(
|
||||
fileitem=fileitem,
|
||||
meta=meta,
|
||||
mediainfo=mediainfo,
|
||||
target_directory=target_directory,
|
||||
source_oper=GuardedStorage(),
|
||||
target_oper=GuardedStorage(),
|
||||
preview=True,
|
||||
)
|
||||
|
||||
|
||||
def test_tv_bluray_dir_preview_preserves_disk_folder_from_meta_part():
|
||||
transferinfo = _build_bluray_dir_preview(
|
||||
source_name="Breaking Bad Season 2 - Disk 1",
|
||||
media_type=MediaType.TV,
|
||||
season=2,
|
||||
part="Disk1",
|
||||
)
|
||||
|
||||
assert transferinfo.success is True
|
||||
assert transferinfo.target_item.path == "/library/Breaking Bad (2008)/Season 2/Disc 1"
|
||||
assert transferinfo.target_diritem.path == transferinfo.target_item.path
|
||||
assert transferinfo.file_list_new == [transferinfo.target_item.path]
|
||||
|
||||
|
||||
def test_tv_bluray_dir_preview_preserves_disc_folder_from_source_name():
|
||||
transferinfo = _build_bluray_dir_preview(
|
||||
source_name="BREAKING_BAD_S01D01",
|
||||
media_type=MediaType.TV,
|
||||
season=1,
|
||||
)
|
||||
|
||||
assert transferinfo.success is True
|
||||
assert transferinfo.target_item.path == "/library/Breaking Bad (2008)/Season 1/Disc 1"
|
||||
|
||||
|
||||
def test_tv_bluray_dir_preview_falls_back_to_source_name_without_disc_number():
|
||||
source_name = "Breaking Bad Season 3 Bonus Disc"
|
||||
transferinfo = _build_bluray_dir_preview(
|
||||
source_name=source_name,
|
||||
media_type=MediaType.TV,
|
||||
season=3,
|
||||
)
|
||||
|
||||
assert transferinfo.success is True
|
||||
assert transferinfo.target_item.path == f"/library/Breaking Bad (2008)/Season 3/{source_name}"
|
||||
|
||||
|
||||
def test_movie_bluray_dir_preview_keeps_movie_root_layout():
|
||||
transferinfo = _build_bluray_dir_preview(
|
||||
source_name="Test Movie Disc 1",
|
||||
media_type=MediaType.MOVIE,
|
||||
part="Disc1",
|
||||
)
|
||||
|
||||
assert transferinfo.success is True
|
||||
assert transferinfo.target_item.path == "/library/Test Movie (2026)"
|
||||
|
||||
Reference in New Issue
Block a user