import unittest from importlib.machinery import SourceFileLoader from pathlib import Path from unittest.mock import patch ROOT = Path(__file__).resolve().parents[1] MODULE = SourceFileLoader("libvio_spider", str(ROOT / "libvio.py")).load_module() Spider = MODULE.Spider class TestLibVioSpider(unittest.TestCase): def setUp(self): self.spider = Spider() self.spider.init() def test_home_content_exposes_expected_categories(self): content = self.spider.homeContent(False) class_ids = [item["type_id"] for item in content["class"]] self.assertEqual(class_ids, ["index", "movie", "series", "anime", "jpandkr", "euandus"]) def test_parse_list_cards_extracts_compact_vod_id(self): html = """
更新至10集
""" cards = self.spider._parse_list_cards(html) self.assertEqual( cards, [ { "vod_id": "456", "vod_name": "示例影片", "vod_pic": "https://www.libvio.la/cover.jpg", "vod_remarks": "更新至10集", } ], ) @patch.object(Spider, "_request_html") def test_home_video_content_reuses_list_card_parser(self, mock_request_html): mock_request_html.return_value = """
HD
""" result = self.spider.homeVideoContent() self.assertEqual(result["list"][0]["vod_id"], "111") self.assertEqual(result["list"][0]["vod_name"], "最近更新") @patch.object(Spider, "_request_html") def test_category_content_builds_page_result(self, mock_request_html): mock_request_html.return_value = """
完结
""" result = self.spider.categoryContent("movie", "2", False, {}) self.assertEqual(result["page"], 2) self.assertEqual(result["list"][0]["vod_id"], "222") @patch.object(Spider, "_request_html") def test_search_content_reuses_card_parser(self, mock_request_html): mock_request_html.return_value = """
抢先版
""" result = self.spider.searchContent("繁花", False, "1") self.assertEqual(result["list"][0]["vod_id"], "333") self.assertEqual(result["list"][0]["vod_name"], "搜索影片") def test_parse_detail_page_extracts_fields_and_preserves_pan_sources(self): html = """

示例剧

类型:剧情

地区:大陆

年份:2026

导演:张三

主演:李四王五

简介:一段剧情简介

在线播放

夸克资源

视频下载(UC)

合集 https://drive.uc.cn/s/e1532998c2bf4?public=1
""" result = self.spider._parse_detail_page(html, "999") vod = result["list"][0] self.assertEqual(vod["vod_id"], "999") self.assertEqual(vod["path"], "https://www.libvio.la/detail/999.html") self.assertEqual(vod["vod_name"], "示例剧") self.assertEqual(vod["type_name"], "剧情") self.assertEqual(vod["vod_area"], "大陆") self.assertEqual(vod["vod_year"], "2026") self.assertEqual(vod["vod_director"], "张三") self.assertEqual(vod["vod_actor"], "李四,王五") self.assertEqual(vod["vod_content"], "一段剧情简介") self.assertEqual(vod["vod_play_from"], "LibVIO$$$UC") self.assertEqual( vod["vod_play_url"], "第1集$999-1-1#第2集$999-1-2$$$合集$https://drive.uc.cn/s/e1532998c2bf4?public=1", ) def test_extract_netdisk_sources_deduplicates_same_link(self): html = """

视频下载(UC)

合集 https://drive.uc.cn/s/e1532998c2bf4?public=1 一键复制 https://drive.uc.cn/s/e1532998c2bf4?public=1
""" self.assertEqual( self.spider._extract_netdisk_sources(html), [{"from": "UC", "urls": "合集$https://drive.uc.cn/s/e1532998c2bf4?public=1"}], ) @patch.object(Spider, "_request_html") def test_detail_content_builds_detail_request_url_from_vod_id(self, mock_request_html): mock_request_html.return_value = """

详情影片

""" result = self.spider.detailContent(["123"]) self.assertEqual(mock_request_html.call_args.args[0], "https://www.libvio.la/detail/123.html") self.assertEqual(result["list"][0]["vod_id"], "123") def test_extract_player_config_reads_json_assignment(self): html = '' data = self.spider._parse_player_config(html) self.assertEqual(data["from"], "line") def test_extract_play_api_base_reads_player_js(self): body = 'var player={}; src="/player/api.php?url=";' self.assertEqual(self.spider._extract_play_api_base(body), "https://www.libvio.la/player/api.php?url=") @patch.object(Spider, "_request_html") def test_player_content_resolves_direct_api_url(self, mock_request_html): mock_request_html.side_effect = [ '', 'src="/player/api.php?url="', 'var urls="https://video.example/final.m3u8";', ] result = self.spider.playerContent("LibVIO", "999-1-1", {}) self.assertEqual(result["parse"], 0) self.assertEqual(result["url"], "https://video.example/final.m3u8") self.assertEqual(result["header"]["Referer"], "https://www.libvio.la/") @patch.object(Spider, "_request_html") def test_player_content_returns_empty_for_pan_source(self, mock_request_html): mock_request_html.return_value = '' self.assertEqual(self.spider.playerContent("LibVIO", "999-1-1", {}), {"parse": 0, "playUrl": "", "url": ""}) def test_player_content_returns_direct_netdisk_link(self): result = self.spider.playerContent("UC", "https://drive.uc.cn/s/e1532998c2bf4?public=1", {}) self.assertEqual( result, { "parse": 0, "playUrl": "", "url": "https://drive.uc.cn/s/e1532998c2bf4?public=1", }, ) if __name__ == "__main__": unittest.main()