komix-jmcomic 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- komix_jmcomic-0.1.0/PKG-INFO +28 -0
- komix_jmcomic-0.1.0/README.md +18 -0
- komix_jmcomic-0.1.0/pyproject.toml +17 -0
- komix_jmcomic-0.1.0/setup.cfg +4 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic/__init__.py +0 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic/hookimpls.py +32 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic/jmcomic.py +123 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic/magic.py +13 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic.egg-info/PKG-INFO +28 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic.egg-info/SOURCES.txt +12 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic.egg-info/dependency_links.txt +1 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic.egg-info/entry_points.txt +2 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic.egg-info/requires.txt +3 -0
- komix_jmcomic-0.1.0/src/komix_jmcomic.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: komix-jmcomic
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: JMComic Plugin for KoMiX
|
|
5
|
+
Requires-Python: >=3.12
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: komix>=0.1.2
|
|
8
|
+
Requires-Dist: pycryptodome>=3.23.0
|
|
9
|
+
Requires-Dist: requests>=2.34.2
|
|
10
|
+
|
|
11
|
+
# komix-jmcomic
|
|
12
|
+
|
|
13
|
+
JMComic Plugin for KoMiX
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install komix
|
|
19
|
+
pip install komix-jmcomic
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
文件组织方式:漫画库/JM漫画ID/漫画文件夹或文件,例如:jmcomics/JM1425367/金瓶梅.cbz
|
|
25
|
+
|
|
26
|
+
主要是靠漫画 ID 进行刮削
|
|
27
|
+
|
|
28
|
+
运行 `komix` 命令,进入后台,选择漫画库以管理漫画
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# komix-jmcomic
|
|
2
|
+
|
|
3
|
+
JMComic Plugin for KoMiX
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install komix
|
|
9
|
+
pip install komix-jmcomic
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
文件组织方式:漫画库/JM漫画ID/漫画文件夹或文件,例如:jmcomics/JM1425367/金瓶梅.cbz
|
|
15
|
+
|
|
16
|
+
主要是靠漫画 ID 进行刮削
|
|
17
|
+
|
|
18
|
+
运行 `komix` 命令,进入后台,选择漫画库以管理漫画
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "komix-jmcomic"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "JMComic Plugin for KoMiX"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.12"
|
|
7
|
+
dependencies = [
|
|
8
|
+
"komix>=0.1.2",
|
|
9
|
+
"pycryptodome>=3.23.0",
|
|
10
|
+
"requests>=2.34.2",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[project.entry-points.komix]
|
|
14
|
+
jmcomic = "komix_jmcomic.hookimpls"
|
|
15
|
+
|
|
16
|
+
[tool.hatch.build.targets.wheel]
|
|
17
|
+
packages = ["src/komix_jmcomic"]
|
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from komix import hookimpl
|
|
2
|
+
from komix.comicinfo import ComicInfo
|
|
3
|
+
|
|
4
|
+
from .jmcomic import JmComic
|
|
5
|
+
|
|
6
|
+
jm = JmComic()
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def comicinfo(comic_id: str) -> ComicInfo:
|
|
10
|
+
data = jm.details(int(comic_id))
|
|
11
|
+
return ComicInfo(
|
|
12
|
+
title=data["name"],
|
|
13
|
+
id=str(data["id"]),
|
|
14
|
+
author=", ".join(data["author"]),
|
|
15
|
+
summary=data["description"],
|
|
16
|
+
tags=data["tags"]
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@hookimpl
|
|
21
|
+
def search(query: str) -> list[ComicInfo]:
|
|
22
|
+
return [comicinfo(query[2:])]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@hookimpl
|
|
26
|
+
def fetch_comicinfo(comic_id: str) -> ComicInfo:
|
|
27
|
+
return comicinfo(comic_id)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@hookimpl
|
|
31
|
+
def fetch_cover_url(comic_id: str):
|
|
32
|
+
return jm.cover_url(int(comic_id))
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import hashlib
|
|
2
|
+
import json
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
import requests
|
|
6
|
+
|
|
7
|
+
from . import magic
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class JmComic:
|
|
11
|
+
def __init__(self, domain_shunt: int = 1, image_shunt: int = 1):
|
|
12
|
+
self.pkgname = "com.example.app"
|
|
13
|
+
self.version = "2.0.16"
|
|
14
|
+
self.ua = (
|
|
15
|
+
"Mozilla/5.0 (X11; Linux x86_64; rv:151.0) Gecko/20100101 Firefox/151.0"
|
|
16
|
+
)
|
|
17
|
+
self.headers = {
|
|
18
|
+
"base": {
|
|
19
|
+
"Accept": "*/*",
|
|
20
|
+
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
21
|
+
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
|
|
22
|
+
"Connection": "keep-alive",
|
|
23
|
+
"Origin": "https://localhost",
|
|
24
|
+
"Referer": "https://localhost/",
|
|
25
|
+
"Sec-Fetch-Dest": "empty",
|
|
26
|
+
"Sec-Fetch-Mode": "cors",
|
|
27
|
+
"Sec-Fetch-Site": "cross-site",
|
|
28
|
+
"X-Requested-With": self.pkgname,
|
|
29
|
+
},
|
|
30
|
+
"api": {
|
|
31
|
+
"Accept": "*/*",
|
|
32
|
+
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
33
|
+
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
|
|
34
|
+
"Connection": "keep-alive",
|
|
35
|
+
"Origin": "https://localhost",
|
|
36
|
+
"Referer": "https://localhost/",
|
|
37
|
+
"Sec-Fetch-Dest": "empty",
|
|
38
|
+
"Sec-Fetch-Mode": "cors",
|
|
39
|
+
"Sec-Fetch-Site": "cross-site",
|
|
40
|
+
"Sec-Fetch-Storage-Access": "active",
|
|
41
|
+
"User-Agent": self.ua,
|
|
42
|
+
"X-Requested-With": self.pkgname,
|
|
43
|
+
"Authorization": "Bearer",
|
|
44
|
+
},
|
|
45
|
+
"image": {
|
|
46
|
+
"Accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
|
|
47
|
+
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
48
|
+
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
|
|
49
|
+
"Connection": "keep-alive",
|
|
50
|
+
"Referer": "https://localhost/",
|
|
51
|
+
"Sec-Fetch-Dest": "image",
|
|
52
|
+
"Sec-Fetch-Mode": "no-cors",
|
|
53
|
+
"Sec-Fetch-Site": "cross-site",
|
|
54
|
+
"Sec-Fetch-Storage-Access": "active",
|
|
55
|
+
"User-Agent": self.ua,
|
|
56
|
+
"X-Requested-With": self.pkgname,
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
self.url = {}
|
|
60
|
+
self.url["api"] = self._api_url(domain_shunt)
|
|
61
|
+
self.url["image"] = self._image_url(image_shunt)
|
|
62
|
+
|
|
63
|
+
def _domains(self) -> list[str]:
|
|
64
|
+
url = "https://rup4a04-c02.tos-cn-hongkong.bytepluses.com/newsvr-2025.txt"
|
|
65
|
+
response = requests.get(url, headers=self.headers["base"])
|
|
66
|
+
result = magic.cast(response.text[3:], "diosfjckwpqpdfjkvnqQjsik")
|
|
67
|
+
return json.loads(result)["Server"]
|
|
68
|
+
|
|
69
|
+
def _api_url(self, domain_shunt: int) -> str:
|
|
70
|
+
domains = self._domains()
|
|
71
|
+
domain = domains[(domain_shunt - 1) % len(domains)]
|
|
72
|
+
return f"https://{domain}"
|
|
73
|
+
|
|
74
|
+
def _fetch_data(self, url: str) -> str:
|
|
75
|
+
t = int(time.time())
|
|
76
|
+
token = hashlib.md5(f"{t}18comicAPPContent".encode()).hexdigest()
|
|
77
|
+
self.headers["api"].update(
|
|
78
|
+
{
|
|
79
|
+
"token": token,
|
|
80
|
+
"tokenparam": f"{t},{self.version}",
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
response = requests.get(url, headers=self.headers["api"])
|
|
84
|
+
return magic.cast(response.json()["data"], f"{t}185Hcomic3PAPP7R")
|
|
85
|
+
|
|
86
|
+
def _image_url(self, image_shunt: int) -> str:
|
|
87
|
+
url = f"{self.url['api']}/setting?app_img_shunt={image_shunt}&express="
|
|
88
|
+
return json.loads(self._fetch_data(url))["img_host"]
|
|
89
|
+
|
|
90
|
+
def search(
|
|
91
|
+
self, query: str, option: str = "mr", page: int = 1
|
|
92
|
+
) -> tuple[list[dict], int]:
|
|
93
|
+
"""
|
|
94
|
+
Search for comics by keyword.
|
|
95
|
+
|
|
96
|
+
:param query: The search query string.
|
|
97
|
+
:param option: The search option string. Allowed values are "mr-最新", "mv-總排行", "mv_m-月排行", "mv_w-周排行", "mv_t-日排行", "mp-最多圖片", "tf-最多喜歡".
|
|
98
|
+
:param page: The page number to retrieve.
|
|
99
|
+
:return: A tuple containing the search results and the maximum page number.
|
|
100
|
+
"""
|
|
101
|
+
url = f"{self.url['api']}/search?search_query={query}&o={option}&page={page}"
|
|
102
|
+
data = json.loads(self._fetch_data(url))
|
|
103
|
+
max_page = data["total"] // 80
|
|
104
|
+
return data["content"], max_page
|
|
105
|
+
|
|
106
|
+
def details(self, id: int) -> dict:
|
|
107
|
+
"""
|
|
108
|
+
Get the details of a comic issue by its ID.
|
|
109
|
+
|
|
110
|
+
:param id: The ID of the comic issue.
|
|
111
|
+
:return: A dictionary containing the issue details.
|
|
112
|
+
"""
|
|
113
|
+
url = f"{self.url['api']}/album?id={id}"
|
|
114
|
+
return json.loads(self._fetch_data(url))
|
|
115
|
+
|
|
116
|
+
def cover_url(self, id: int) -> str:
|
|
117
|
+
"""
|
|
118
|
+
Get the URL of the cover image for a comic issue.
|
|
119
|
+
|
|
120
|
+
:param id: The ID of the comic issue.
|
|
121
|
+
:return: The URL of the cover image.
|
|
122
|
+
"""
|
|
123
|
+
return f"{self.url['image']}/media/albums/{id}_3x4.jpg"
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from base64 import b64decode
|
|
2
|
+
from hashlib import md5
|
|
3
|
+
|
|
4
|
+
from Crypto.Cipher import AES
|
|
5
|
+
from Crypto.Util.Padding import unpad
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def cast(spell: str, will: str) -> str:
|
|
9
|
+
secret = b64decode(spell)
|
|
10
|
+
key = md5(will.encode()).hexdigest().encode()
|
|
11
|
+
cipher = AES.new(key, AES.MODE_ECB)
|
|
12
|
+
result = unpad(cipher.decrypt(secret), AES.block_size).decode()
|
|
13
|
+
return result
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: komix-jmcomic
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: JMComic Plugin for KoMiX
|
|
5
|
+
Requires-Python: >=3.12
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: komix>=0.1.2
|
|
8
|
+
Requires-Dist: pycryptodome>=3.23.0
|
|
9
|
+
Requires-Dist: requests>=2.34.2
|
|
10
|
+
|
|
11
|
+
# komix-jmcomic
|
|
12
|
+
|
|
13
|
+
JMComic Plugin for KoMiX
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install komix
|
|
19
|
+
pip install komix-jmcomic
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
文件组织方式:漫画库/JM漫画ID/漫画文件夹或文件,例如:jmcomics/JM1425367/金瓶梅.cbz
|
|
25
|
+
|
|
26
|
+
主要是靠漫画 ID 进行刮削
|
|
27
|
+
|
|
28
|
+
运行 `komix` 命令,进入后台,选择漫画库以管理漫画
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
src/komix_jmcomic/__init__.py
|
|
4
|
+
src/komix_jmcomic/hookimpls.py
|
|
5
|
+
src/komix_jmcomic/jmcomic.py
|
|
6
|
+
src/komix_jmcomic/magic.py
|
|
7
|
+
src/komix_jmcomic.egg-info/PKG-INFO
|
|
8
|
+
src/komix_jmcomic.egg-info/SOURCES.txt
|
|
9
|
+
src/komix_jmcomic.egg-info/dependency_links.txt
|
|
10
|
+
src/komix_jmcomic.egg-info/entry_points.txt
|
|
11
|
+
src/komix_jmcomic.egg-info/requires.txt
|
|
12
|
+
src/komix_jmcomic.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
komix_jmcomic
|