trackkun-dom 0.0.1
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.
- package/index.d.ts +154 -0
- package/index.esm.js +1 -0
- package/index.js +1 -0
- package/init.js +1 -0
- package/package.json +9 -0
- package/specs.json +1 -0
- package/tags.json +1 -0
package/index.d.ts
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { SiteMeta, TitleChapter, RawUpdate } from '@trackkun/schema';
|
|
2
|
+
|
|
3
|
+
declare function getImgNameFromUrl(url: string): string;
|
|
4
|
+
|
|
5
|
+
declare enum TagCategory {
|
|
6
|
+
type = 0,
|
|
7
|
+
demographic = 1,
|
|
8
|
+
format = 2,
|
|
9
|
+
restrictedContent = 3,
|
|
10
|
+
genre = 4
|
|
11
|
+
}
|
|
12
|
+
interface Tag {
|
|
13
|
+
id: number;
|
|
14
|
+
name: string;
|
|
15
|
+
altNames?: string[];
|
|
16
|
+
category?: TagCategory;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
declare enum PageType {
|
|
20
|
+
title = "title",
|
|
21
|
+
reader = "reader",
|
|
22
|
+
update = "update",
|
|
23
|
+
search = "search"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface BaseRawPageData<P extends PageType> {
|
|
27
|
+
type: P;
|
|
28
|
+
url: string;
|
|
29
|
+
specId?: string;
|
|
30
|
+
siteMeta?: SiteMeta;
|
|
31
|
+
siteName?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
interface RawTitleData extends BaseRawPageData<PageType.title> {
|
|
35
|
+
slug: string;
|
|
36
|
+
name: string;
|
|
37
|
+
altNames?: string[];
|
|
38
|
+
langs?: string[];
|
|
39
|
+
imgUrl?: string;
|
|
40
|
+
tags?: number[];
|
|
41
|
+
chapters?: TitleChapter[];
|
|
42
|
+
hasMoreChapters?: boolean;
|
|
43
|
+
isWebtoon?: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface RawReaderData extends BaseRawPageData<PageType.reader> {
|
|
47
|
+
vol?: number;
|
|
48
|
+
chap: number;
|
|
49
|
+
imgs: string[];
|
|
50
|
+
lang?: string;
|
|
51
|
+
slug: string;
|
|
52
|
+
nextSlug?: string;
|
|
53
|
+
prevSlug?: string;
|
|
54
|
+
externalUrl?: string;
|
|
55
|
+
groupName?: string;
|
|
56
|
+
groupUrl?: string;
|
|
57
|
+
title: RawTitleData;
|
|
58
|
+
isWebtoon?: boolean;
|
|
59
|
+
basePath: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface RawSearchData extends BaseRawPageData<PageType.search> {
|
|
63
|
+
rawUpdates: RawUpdate[];
|
|
64
|
+
newTitleBase?: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface RawUpdateData extends BaseRawPageData<PageType.update> {
|
|
68
|
+
newOrigin?: string;
|
|
69
|
+
newName?: string;
|
|
70
|
+
newUpdatePath?: string;
|
|
71
|
+
newTitleBase?: string;
|
|
72
|
+
rawUpdates: RawUpdate[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
type RawPageData = RawReaderData | RawTitleData | RawUpdateData | RawSearchData;
|
|
76
|
+
|
|
77
|
+
interface ChapterSpec {
|
|
78
|
+
sel: string;
|
|
79
|
+
label: string;
|
|
80
|
+
url?: string;
|
|
81
|
+
at?: string;
|
|
82
|
+
}
|
|
83
|
+
interface TitleSpec {
|
|
84
|
+
sel: string;
|
|
85
|
+
url?: string;
|
|
86
|
+
name: string;
|
|
87
|
+
img?: string;
|
|
88
|
+
chapter: ChapterSpec;
|
|
89
|
+
}
|
|
90
|
+
interface TitlePageSpec extends Omit<TitleSpec, 'url'> {
|
|
91
|
+
lazy?: boolean;
|
|
92
|
+
langs?: string;
|
|
93
|
+
type?: string;
|
|
94
|
+
tags?: string;
|
|
95
|
+
}
|
|
96
|
+
interface ReaderPageSpec {
|
|
97
|
+
sel: string;
|
|
98
|
+
img: string;
|
|
99
|
+
label: string;
|
|
100
|
+
title: Pick<TitleSpec, 'sel' | 'name' | 'url' | 'img'>;
|
|
101
|
+
chapter?: ChapterSpec;
|
|
102
|
+
lang?: string;
|
|
103
|
+
next?: string;
|
|
104
|
+
prev?: string;
|
|
105
|
+
}
|
|
106
|
+
interface UpdatePageSpec {
|
|
107
|
+
title: TitleSpec;
|
|
108
|
+
}
|
|
109
|
+
interface SearchPageSpec {
|
|
110
|
+
title: Omit<TitleSpec, 'chapter'> & {
|
|
111
|
+
chapter?: ChapterSpec;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
interface FetchOverride {
|
|
115
|
+
type: string;
|
|
116
|
+
match: string;
|
|
117
|
+
params: {
|
|
118
|
+
id?: string;
|
|
119
|
+
key: string;
|
|
120
|
+
value?: string;
|
|
121
|
+
}[];
|
|
122
|
+
}
|
|
123
|
+
interface SiteSpec {
|
|
124
|
+
id: string;
|
|
125
|
+
generic?: boolean;
|
|
126
|
+
name: string;
|
|
127
|
+
meta: SiteMeta;
|
|
128
|
+
update?: UpdatePageSpec;
|
|
129
|
+
title?: TitlePageSpec;
|
|
130
|
+
reader?: ReaderPageSpec;
|
|
131
|
+
search?: SearchPageSpec;
|
|
132
|
+
fetchOverrides?: FetchOverride[];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
interface RawPageDataArgs {
|
|
136
|
+
type?: PageType;
|
|
137
|
+
spec?: SiteSpec;
|
|
138
|
+
siteMeta?: SiteMeta;
|
|
139
|
+
genericSpecs?: SiteSpec[];
|
|
140
|
+
tags: Tag[];
|
|
141
|
+
oldRawUpdates?: RawUpdate[];
|
|
142
|
+
}
|
|
143
|
+
declare function getRawPageData(args: RawPageDataArgs): Promise<RawPageData | undefined>;
|
|
144
|
+
|
|
145
|
+
interface GetRawUpdateDataArgs {
|
|
146
|
+
spec: SiteSpec;
|
|
147
|
+
siteMeta: SiteMeta;
|
|
148
|
+
root?: HTMLElement;
|
|
149
|
+
lazy?: boolean;
|
|
150
|
+
oldRawUpdates?: RawUpdate[];
|
|
151
|
+
}
|
|
152
|
+
declare function getRawUpdateData(args: GetRawUpdateDataArgs): Promise<RawUpdateData | undefined>;
|
|
153
|
+
|
|
154
|
+
export { BaseRawPageData, ChapterSpec, FetchOverride, GetRawUpdateDataArgs, PageType, RawPageData, RawPageDataArgs, RawReaderData, RawSearchData, RawTitleData, RawUpdateData, ReaderPageSpec, SearchPageSpec, SiteSpec, Tag, TitlePageSpec, TitleSpec, UpdatePageSpec, getImgNameFromUrl, getRawPageData, getRawUpdateData };
|
package/index.esm.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _e="webp",X=["jpg","jpng","png","webp","svg","gif","avif","apng","bmp"];function F(e){return`${qe(e)}.${_e}`}function qe(e){const t=e.split("?")[0].split("#")[0].split("/").filter(Boolean),r=Fe(t.slice(-1)[0]);return r.length>=16?r:t.slice(0,-1).join("").slice(r.length-16)+r}function Fe(e){const t=He(e),r=t.replace(/-\d{3}x\d{3}$/,"");if(r!==t||t===e)return r;const a=t.split(".").reverse();if(a.length<3)return t;const[l,n,...i]=a;return!n||!X.includes(n)||!l||isNaN(+l)?t:i.reverse().join(".")}function He(e){const t=e.lastIndexOf(".");if(t===-1)return e;const r=e.substring(t+1);return X.includes(r)?e.substring(0,t):e}const Qe={text:Ye,attr:Ge,"attr-contain":Je,value:Ze,row:Ve};function m(e,t={}){if(!e)return;const{root:r=document.documentElement,returnAll:a,preProcess:l}=t,n=K(e);if(n.length>1){for(let d=0;d<n.length;d+=1){const p=m(n[d],t);if(p!=null&&p.length)return p}return}const[i,o]=e.split("|");if(!o)return;const c=(o!=null&&o.startsWith("[")&&o.endsWith("]")?o.substring(1,o.length-1).split(","):[o]).map(d=>{const[p,f]=d.split(":");return{action:p,param:f}}),s=i?Array.from(r.querySelectorAll(i)):[r];if(!s.length)return a?[]:void 0;l&&l(s);const u=[];for(const d of s)for(const p of c){const f=Qe[p.action],g=f(d,p.param);if(g){if(a){u.push(g);break}return g}}return a?u:void 0}function Ye(e){return Array.from(e.childNodes).filter(t=>t.nodeType===3).map(t=>T(t.textContent)).filter(Boolean).join(" ").trim()||T(e.textContent)}function Ge(e,t){return T(e.getAttribute(t))}function Je(e,t){let r=e.getAttribute(t);if(!r){const a=e.getAttributeNames().find(l=>l.includes(t));a&&(r=e.getAttribute(a))}return T(r)}function K(e){const t=[],r=e.split("||").map(a=>a.trim()).filter(Boolean);return r.forEach((a,l)=>{if(a.includes("|")){t.push(a);return}const n=r[l+1];n&&(r[l+1]=`${a},${n}`)}),t}function Ze(e){return e.value}function Ve(e,t){var r,a,l,n;if(!t||((r=T(e.textContent))==null?void 0:r.toLowerCase())!==t.toLowerCase())return;const i=Array.from((l=(a=e.parentElement)==null?void 0:a.childNodes)!=null?l:[]);return T((n=i[i.indexOf(e)+1])==null?void 0:n.textContent)}function T(e){if(e)return e?.replace(/(\n|\t)/g," ").trim()||void 0}function ee(e){let t=!1;return new Promise((r,a)=>{Promise.all(e.map(async l=>{const n=await l;!t&&n&&(t=!0,r(n))})).then(()=>{t||r(void 0)})})}async function te(e,t,r){const a=await r(()=>{e=0});if(a)return a;if(!(e<=0))return await new Promise(l=>{setTimeout(async()=>{const n=await te(e-1,t,r);l(n)},t)})}async function I(e,t,r=0){var a;const l=(a=t.root)!=null?a:document.documentElement;return te(t.lazy===!0?200:0,100,()=>{var n;const i=t.all===!0?Array.from(l.querySelectorAll(e)):(n=l.querySelector(e))!=null?n:void 0;return(t.all?!(i!=null&&i.length):!i)?void 0:i})}const Xe=/(vol(ume|\.)?\s*(\d+))/i,Ke=/(ch(ap(t(er)?|\.)?|\.)?|^#)\s*(\d+([_-~,.]\d+)?)/i,et=/\d+([_-~,.]\d+)?/,tt=/[_-~,]/,rt=/^[^a-zA-Z0-9]*|[^a-zA-Z0-9]*$/g;function re(e,t){var r;if(!e||!e)return;if(!isNaN(+e))return{chap:+e};const a=e.match(Xe),l=a!=null&&a[0]?e.replace(a[0],"").trim():e,n=l.match(Ke),i=l.match(et),o=(r=n?.[5])!=null?r:i?.[0];if(!o)return;const c=+o.replace(tt,".");if(isNaN(c))return;const s=a?.[3],u=s&&!isNaN(+s)?+s:void 0,d=l.replace((n||i)[0],"").replace(rt,""),p=t&&d.startsWith(t)?d.replace(t,""):d;return{vol:u,chap:c,label:p||void 0}}const ae=[{regex:/(sec(ond(s)?)? ago|giây trước)/,seconds:1},{regex:/(min(s|ute(s)?)? ago|phút trước)/,seconds:60},{regex:/(hour(s)? ago|giờ trước)/,seconds:3600},{regex:/(day(s)? ago|ngày trước)/,seconds:86400},{regex:/(week(s)? ago|tuần trước)/,seconds:604800},{regex:/(month(s)? ago|tháng trước)/,seconds:2592e3},{regex:/(year(s)? ago|năm trước)/,seconds:31536e3}];function at(e){if(!e||e.includes("now"))return Date.now();if(e.includes("yesterday"))return Date.now()-864e5;const t=new Date(e);if(t instanceof Date){const r=t.valueOf();if(!isNaN(r))return t.getHours()===0&&t.getMinutes()===0?Math.min(Date.now(),r+432e5):r}for(let r=0;r<ae.length;r++){const{regex:a,seconds:l}=ae[r];if(a.test(e)){const n=e.split(" ").slice(-3)[0],i=n=="an"||n==="a"?1:+n;if(isNaN(i)||i<0)return;const o=Date.now()-i*l*1e3;return o>0?o:void 0}}}function ne(e,t){if(!e)return"/";const r=e.replace("{titleSlug}",t),a=r.endsWith("/")?r:r+"/";return a.startsWith("/")?a:"/"+a}var nt=(e=>(e[e.reading=1]="reading",e[e.paused=2]="paused",e[e.plan=3]="plan",e[e.completed=4]="completed",e[e.dropped=5]="dropped",e[e.deleted=6]="deleted",e))(nt||{}),L=(e=>(e[e.none=0]="none",e[e.removeLastSegment=1]="removeLastSegment",e[e.removeIdAfterLastDash=2]="removeIdAfterLastDash",e[e.removeIdBeforeFirstDash=3]="removeIdBeforeFirstDash",e))(L||{}),le=(e=>(e[e.none=0]="none",e[e.removePage=1]="removePage",e))(le||{}),lt=(e=>(e[e.string=1]="string",e[e.number=2]="number",e[e.bool=3]="bool",e[e.selection=4]="selection",e))(lt||{}),ot=(e=>(e[e.SiteUpdate=1]="SiteUpdate",e[e.SiteTitleImg=2]="SiteTitleImg",e))(ot||{});function it(e,{removeTrailingSlash:t=!0}={}){if(!e)return;const r=t&&e.endsWith("/")?e.slice(0,-1):e;try{return new URL(r)}catch{return}}function R(e){var t;if(!(!e||typeof e!="string"))return e.startsWith("http://")||e.startsWith("https://")?(t=it(e))==null?void 0:t.pathname:e}function H({basePath:e,url:t,siteMeta:r}){const a=R(t);if(!a)return;const l=a.replace(e,"");switch(r.readerSlugTransformer){case le.removePage:return l.replace(/-page-\d{1,3}\.html$/,".html");default:return l}}var st=Object.defineProperty,ut=Object.defineProperties,ct=Object.getOwnPropertyDescriptors,oe=Object.getOwnPropertySymbols,pt=Object.prototype.hasOwnProperty,dt=Object.prototype.propertyIsEnumerable,ie=(e,t,r)=>t in e?st(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,ft=(e,t)=>{for(var r in t||(t={}))pt.call(t,r)&&ie(e,r,t[r]);if(oe)for(var r of oe(t))dt.call(t,r)&&ie(e,r,t[r]);return e},gt=(e,t)=>ut(e,ct(t));async function D(e,{root:t=document.documentElement,titleSlug:r="",titleName:a,lazy:l=!0,siteMeta:n}){var i;if(!e)return;const o=[],c=await I(e.sel,{root:t,all:!0,lazy:l});if(!(c!=null&&c.length))return o;const s=(c??[]).map(f=>({label:m(e.label,{root:f}),url:m(e.url,{root:f}),at:m(e.at,{root:f})})),u=s.map(({label:f})=>re(f,a)),d=(i=u[1])==null?void 0:i.chap;!u[0]&&(d===void 0||d<=1)&&(u[0]={label:s[0].label,chap:0});const p=ne(n.readerBase,r);return u.forEach((f,g)=>{var v;if(!f)return;const{url:h,at:y}=s[g],O=H({basePath:p,url:h,siteMeta:n});O&&o.push(gt(ft({},f),{slug:O,ts:at(y)||((v=o[o.length+1])==null?void 0:v.ts)||Date.now()}))}),se(o),o}function se(e){e.sort((t,r)=>{var a,l;return((a=r.vol)!=null?a:0)-((l=t.vol)!=null?l:0)||r.chap-t.chap})}function C({url:e,siteMeta:t}){var r;if(typeof e!="string")return;const a=t.titleSlugTransformer,l=(r=R(e))==null?void 0:r.split("/").filter(Boolean);if(!l||!l.length)return e;const n=l[l.length-1];switch(a){case L.removeLastSegment:return l.length>=2?l[l.length-2]:n;case L.removeIdAfterLastDash:{const i=n.lastIndexOf("-"),o=+n.substring(i+1);return i===-1||isNaN(o)||o<1e4?n:n.substring(0,i)}case L.removeIdBeforeFirstDash:{const i=n.indexOf("-"),o=+n.substring(0,i);return i===-1||isNaN(o)||o<1e3?n:n.substring(i+1)}default:return n}}function mt(){return Math.random().toString(16).slice(2)}async function vt({addListener:e,removeListener:t,transform:r,filter:a,handler:l,onTimeout:n,timeout:i,once:o}){return new Promise(c=>{e(d);const s=()=>o===!0&&t(d),u=i?setTimeout(()=>{s(),c(void 0),n?.()},i):void 0;async function d(p,...f){p=r?r(p):p,p!==void 0&&(!a||a(p,...f))&&(s(),c(p),l?.(p,...f),u&&clearTimeout(u))}})}var ht=Object.defineProperty,ue=Object.getOwnPropertySymbols,yt=Object.prototype.hasOwnProperty,bt=Object.prototype.propertyIsEnumerable,ce=(e,t,r)=>t in e?ht(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,wt=(e,t)=>{for(var r in t||(t={}))yt.call(t,r)&&ce(e,r,t[r]);if(ue)for(var r of ue(t))bt.call(t,r)&&ce(e,r,t[r]);return e};async function Ot(e){const t=await vt(wt({addListener:r=>window.addEventListener("message",r),removeListener:r=>window.removeEventListener("message",r)},e));return t?.data}async function Pt(e){var t;const{receiverWindow:r,timeout:a,targetOrigin:l,event:n,args:i}=e,o={reqId:mt(),event:n,args:i};(t=r||window)==null||t.postMessage(o,l??"*");const c=await Ot({filter:s=>{var u;return((u=s?.data)==null?void 0:u.resId)===o.reqId},timeout:a??3e4,once:!0});return c?.result}const U={isAny:!0};function S(e,...t){return Pt({event:"tk:fetchResult",args:{baseUrl:e,segments:t}})}const $t='meta[property="og:url"]|attr:content,meta[name="url"]|attr:content';function pe(e=document.documentElement){try{return window.location.origin+window.location.pathname}catch{}const t=m($t,{root:e});if(!(!t||R(t)==="/"))return t}function de(e,t){if(!(t!=null&&t.length))return;const r={};e.forEach(({id:l,name:n,altNames:i})=>{r[Q(n)]=l,i&&i.forEach(o=>{r[Q(o)]=l})});const a=t.map(l=>r[Q(l)]).filter(Boolean);return a.length===0?void 0:Array.from(new Set(a)).sort((l,n)=>l-n)}function Q(e){const t=e.toLowerCase().replaceAll(" ","");return t[t.length-1]==="s"?t.substring(0,t.length-1):t}var w=(e=>(e.title="title",e.reader="reader",e.update="update",e.search="search",e))(w||{}),St=Object.defineProperty,jt=Object.defineProperties,xt=Object.getOwnPropertyDescriptors,fe=Object.getOwnPropertySymbols,Nt=Object.prototype.hasOwnProperty,Mt=Object.prototype.propertyIsEnumerable,ge=(e,t,r)=>t in e?St(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,W=(e,t)=>{for(var r in t||(t={}))Nt.call(t,r)&&ge(e,r,t[r]);if(fe)for(var r of fe(t))Mt.call(t,r)&&ge(e,r,t[r]);return e},me=(e,t)=>jt(e,xt(t));async function Tt({spec:e,siteMeta:t,tags:r}){var a,l;if(e.id=="mangadex")return await At({tags:r});if(!(e!=null&&e.title))return;const{sel:n,name:i,img:o,chapter:c,langs:s,tags:u,type:d}=e.title;if(!n||!i||!c||!await I(n,{lazy:(a=e.title.lazy)!=null?a:!1}))return;const p=m(i);if(!p)return;const f=C({url:pe(),siteMeta:t});if(!f)return;const g=(l=m(u,{returnAll:!0}))!=null?l:[],v=m(d),h={type:w.title,url:location.origin+location.pathname,slug:f,name:p,langs:m(s,{returnAll:!0}),tags:de(r,[...g??[],...v?[v]:[]]),imgUrl:m(o),chapters:[]};return e.id==="comick"?W(W({},h),await Ut()):me(W({},h),{chapters:await D(c,{siteMeta:t,lazy:!0,titleSlug:f,titleName:p})})}async function Ut(){const e="https://api.comick.app/",[t]=await Promise.all([S(e,"comic",U,"chapters")]);if(!t)return{};const r=t.value,a=r.chapters.map(l=>{const{vol:n,chap:i,hid:o,lang:c,updated_at:s}=l,u=typeof i=="string"&&!isNaN(+i)?+i:void 0;if(typeof u=="number")return{slug:o,vol:typeof n=="string"&&!isNaN(+n)?+n:void 0,chap:u,lang:c,ts:new Date(s).valueOf()}}).filter(Boolean);return{hasMoreChapters:r.chapters.length<r.total,chapters:a}}async function At({tags:e}){var t,r,a;const l="https://api.mangadex.org/manga/",[n,i]=await Promise.all([S(l,U),S(l,U,"feed")]);if(!n||!i)return;const o=(a=(r=(t=i.value.data)==null?void 0:t.map)==null?void 0:r.call(t,u=>{const{attributes:d,id:p}=u;if(typeof d!="object"||typeof p!="string"||!p)return;const{externalUrl:f,title:g,volume:v,chapter:h,translatedLanguage:y}=d;return{slug:f||p,label:g||void 0,vol:typeof v=="string"?+v:void 0,chap:typeof h=="string"?+h:void 0,lang:y||"en",ts:new Date(d.readableAt).valueOf()}}).filter(u=>u?.chap!=null))!=null?a:[],{data:c}=n.value;if(!c)return;const s=ve({data:c,entryTags:e});if(s)return me(W({},s),{chapters:o,hasMoreChapters:(i.value.total||0)>(i.value.limit||0)})}function ve({data:e,entryTags:t}){var r,a,l,n,i;const{id:o,attributes:c,relationships:s}=e;if(!o||typeof o!="string"||typeof c!="object")return;const{title:u,availableTranslatedLanguages:d,altTitles:p,tags:f,restrictedContent:g}=c;if(typeof u!="object"||!Array.isArray(d))return;const v=Object.values(u)[0];if(!v||typeof v!="string")return;const h=Bt(),y=(a=(r=d?.map)==null?void 0:r.call(d,b=>typeof b=="string"?b:void 0).filter(Boolean))!=null?a:[],O=y.filter(b=>b&&(!h||h.includes(b))),j=(l=p?.map)==null?void 0:l.call(p,b=>{const[[x,N]=[]]=Object.entries(b);return{lang:x,name:N}}),P=(n=s?.find)==null?void 0:n.call(s,b=>b.type==="cover_art"),A=(i=P?.attributes)==null?void 0:i.fileName,B=A?`https://mangadex.org/covers/${o}/${A}`:void 0,z=(f||[]).map(b=>{var x,N;return(N=(x=b?.attributes)==null?void 0:x.name)==null?void 0:N.en}).concat(g).filter(Boolean);return{type:w.title,url:`${location.origin}/title/${o}`,slug:o,name:v,altNames:j,langs:O.length>0?O:y,imgUrl:B,tags:de(t,z),isWebtoon:f?.some(b=>b.attributes.name.en==="Long Strip")}}function Bt(){var e;const t=localStorage.getItem("md");if(t)try{const r=JSON.parse(t),a=(e=r?.userPreferences)==null?void 0:e.filteredLanguages;return a!=null&&a.length?a:void 0}catch{return}}var Rt=Object.defineProperty,Et=Object.defineProperties,It=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertySymbols,Lt=Object.prototype.hasOwnProperty,Dt=Object.prototype.propertyIsEnumerable,ye=(e,t,r)=>t in e?Rt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Ct=(e,t)=>{for(var r in t||(t={}))Lt.call(t,r)&&ye(e,r,t[r]);if(he)for(var r of he(t))Dt.call(t,r)&&ye(e,r,t[r]);return e},Wt=(e,t)=>Et(e,It(t));async function kt({spec:e,siteMeta:t,tags:r}){var a,l;if(e.id=="mangadex")return await qt({entryTags:r});if(!(e!=null&&e.reader)||!await _t(e.reader))return;const n=await zt({spec:e,siteMeta:t});if(!n)return;const{name:i,slug:o,chapters:c}=n,s=(a=m(e.reader.label))==null?void 0:a.toLowerCase().replace(i.toLowerCase(),"");if(!s)return;const{vol:u,chap:d=0}=re(s,i)||{};let p;const f=(l=m(e.reader.img,{returnAll:!0,preProcess(v){const h=v.map(y=>+(y.getAttribute("height")||0)/+(y.getAttribute("width")||1));h.some(y=>y>2.5)?p=!0:h.filter(Boolean).length>Math.max(1,h.length-2)&&(p=!1)}}))!=null?l:[];if(!f.length)return;const g=ne(t.readerBase,o);return{type:w.reader,url:location.origin+location.pathname,isWebtoon:p,vol:u,chap:d,lang:m(e.reader.lang),slug:H({basePath:g,url:location.pathname,siteMeta:t}),nextSlug:be({sel:e.reader.next,basePath:g,siteMeta:t}),prevSlug:be({sel:e.reader.prev,basePath:g,siteMeta:t}),basePath:g,imgs:f,title:{type:w.title,url:n.url,slug:o,name:i,chapters:c}}}async function zt({spec:e,siteMeta:t}){var r,a;const{sel:l,name:n,url:i}=e.reader.title||{};if(!l||!n||!i)return;const o=document.querySelector(l);if(!(o instanceof HTMLElement))return;const c=m(n,{root:o}),s=m(i,{root:o}),u=C({url:s,siteMeta:t});if(!(!c||!s||!u))return{type:w.title,url:s,name:c,slug:u,chapters:(a=await D((r=e.reader)==null?void 0:r.chapter,{titleSlug:u,titleName:c,siteMeta:t}))!=null?a:[]}}function be({sel:e,basePath:t,siteMeta:r}){const a=m(e);if(!(!a||a.startsWith("#")||a.startsWith("/#")))return H({basePath:t,url:a,siteMeta:r})}async function _t(e){const{sel:t,img:r}=e;if(!t||!r||!document.querySelector(t))return!1;const a=K(r).map(l=>l.split("|")[0]).join(",");return!!await I(a,{root:document.documentElement,lazy:!0,all:!1})}async function qt({entryTags:e}){var t,r,a,l,n,i,o,c,s,u,d,p,f,g,v;const h="https://api.mangadex.org/",[y,O,j]=await Promise.all([S(h,"chapter",U),S(h,"at-home","server",U),S(h,"manga",U,"aggregate")]);if(!y||!O||!j)return;const P=y.value.data,{volume:A,chapter:B,externalUrl:z,translatedLanguage:b}=P.attributes||{},{baseUrl:x,chapter:{data:N,dataSaver:Ee,hash:Ie}}=O.value,J=(r=(t=P.relationships)==null?void 0:t.find)==null?void 0:r.call(t,$=>$.type==="manga");if(!J)return;const _=ve({data:J,entryTags:e});if(!_||typeof((a=j.value)==null?void 0:a.volumes)!="object")return;const M=Object.values(j.value.volumes).map(({volume:$,chapters:We})=>{const ke=$==="none"||typeof $!="string"?void 0:+$;return Object.values(We).map(({id:ze,chapter:q})=>typeof q!="string"||q==="none"?void 0:{vol:ke,chap:+q,slug:ze})}).flat().filter(Boolean).reverse();if(typeof B!="string"||B==="none"){if(M.length)return;M.push({chap:0,slug:P.id})}const Z=M.findIndex($=>$.slug===P.id),E=(n=(l=P.relationships)==null?void 0:l.find)==null?void 0:n.call(l,$=>$.type==="scanlation_group"),Le=x.endsWith("/")?x:x+"/",V=!!((o=(i=localStorage.getItem("md"))==null?void 0:i.includes)!=null&&o.call(i,'"dataSaver":true')),De=`${Le}${V?"data-saver":"data"}/`,Ce=(d=(u=(s=(c=V?Ee:N)!=null?c:[]).map)==null?void 0:u.call(s,$=>`${De}${Ie}/${$}`))!=null?d:[];return{type:w.reader,url:location.origin+location.pathname,externalUrl:z,vol:typeof A=="string"?+A:void 0,chap:+B||0,imgs:Ce,lang:b,slug:P.id,prevSlug:(p=M[Z+1])==null?void 0:p.slug,nextSlug:(f=M[Z-1])==null?void 0:f.slug,basePath:"/chapter/",groupName:(g=E?.attributes)==null?void 0:g.name,groupUrl:(v=E?.attributes)==null?void 0:v.website,title:Wt(Ct({},_),{langs:b?[b]:_.langs,chapters:M})}}function we(e){if(e.length<=1)return;const t=e.slice(0,30).map(n=>n.split("/").filter(Boolean).slice(0,-1)),r=t[0],a=r.length;if(!a)return;const l=[];for(let n=0;n<a;n++){const i=r[n];if(!t.every(o=>o[n]===i))break;l.push(i)}if(l.length)return l.join("/")}async function Ft({spec:e,siteMeta:t}){var r;const a=(r=e.search)==null?void 0:r.title;if(!a)return;const{chapter:l}=a,n=[];if(await new Promise(o=>setTimeout(o,3e3)),await Promise.all(Array.from(document.querySelectorAll(a.sel)).map(async o=>{var c;const s=m(a.url,{root:o}),u=R(s);if(!u)return;const d=m(a.name,{root:o});if(!d)return;const p=m(a.img,{root:o}),f=p?F(p):void 0,g=C({url:u,siteMeta:t});g&&n.push({path:u,slug:g,img:f,name:d,chapters:(c=await D(l,{root:o,siteMeta:t,titleSlug:g,titleName:d}))!=null?c:[]})})),!n.length)return;const i=we(n.map(o=>o.path));return{type:w.search,url:location.origin+location.pathname,rawUpdates:n,newTitleBase:i!==t.titleBase?i:void 0}}var Ht=Object.defineProperty,Oe=Object.getOwnPropertySymbols,Qt=Object.prototype.hasOwnProperty,Yt=Object.prototype.propertyIsEnumerable,Pe=(e,t,r)=>t in e?Ht(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Gt=(e,t)=>{for(var r in t||(t={}))Qt.call(t,r)&&Pe(e,r,t[r]);if(Oe)for(var r of Oe(t))Yt.call(t,r)&&Pe(e,r,t[r]);return e};function Jt(e,t){var r,a;const l=[...t],n=[];let i=-1,o=-1;for(let s=0;s<e.length&&!(!l.length&&s>=10);s++){const u=Gt({},e[s]),d=l.findIndex(g=>g.slug===u.slug&&g.name===u.name),p=d===-1?void 0:l.splice(d,1)[0],f=!p||((r=p.chapters[0])==null?void 0:r.chap)!==((a=u.chapters[0])==null?void 0:a.chap);d!==-1&&(o=s),f&&(i=s,u.changed=!0),n.push(u)}if(i===-1)return[];if(l.length){const s=Math.max(10,o+1);n.splice(s);for(let u=o+1;u<n.length;u++)n[u].changed=!1;return n}const c=Math.min(Math.max(i+1,10),Math.max(o+1,50));return n.slice(0,c)}var Zt=Object.defineProperty,k=Object.getOwnPropertySymbols,$e=Object.prototype.hasOwnProperty,Se=Object.prototype.propertyIsEnumerable,je=(e,t,r)=>t in e?Zt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Vt=(e,t)=>{for(var r in t||(t={}))$e.call(t,r)&&je(e,r,t[r]);if(k)for(var r of k(t))Se.call(t,r)&&je(e,r,t[r]);return e},xe=(e,t)=>{var r={};for(var a in e)$e.call(e,a)&&t.indexOf(a)<0&&(r[a]=e[a]);if(e!=null&&k)for(var a of k(e))t.indexOf(a)<0&&Se.call(e,a)&&(r[a]=e[a]);return r};async function Ne(e){return e.spec.id=="mangadex"?await Kt(e):e.spec.id=="comick"?await er(e):await Xt(e)}async function Xt({spec:e,siteMeta:t,root:r,lazy:a,oldRawUpdates:l}){var n;if(!((n=e?.update)!=null&&n.title))return;const i=e.update.title,{chapter:o}=i,c=xe(i,["chapter"]);if(!c.sel||!c.name||!(o!=null&&o.sel)||!(o!=null&&o.label))return;const s=await I(c.sel,{root:r,lazy:a??!0,all:!0});if(!(s!=null&&s.length))return;const u=s.map(f=>{const g=m(c.url,{root:f}),v=R(g);if(!v)return;const h=m(c.name,{root:f});if(!h)return;const y=m(c.img,{root:f}),O=y?F(y):void 0;return{titleEl:f,path:v,img:O,name:h}}).filter(Boolean);if(!u.length)return;const d=we(u.map(f=>f.path)),p=await Promise.all(u.map(async f=>{var g;const v=f,{path:h,titleEl:y}=v,O=xe(v,["path","titleEl"]),j=C({url:h,siteMeta:t}),P=(g=await D(o,{siteMeta:t,root:y,titleSlug:j,titleName:O?.name}))!=null?g:[];return Vt({slug:j,chapters:P},O)}));return Y({newTitleBase:d&&d!==t.titleBase?d:void 0,rawUpdates:p,oldRawUpdates:l})}async function Kt(e){const t="https://api.mangadex.org/",[r,a]=await Promise.all([S(t,"chapter"),S(t,"manga")]);if(!a||!r)return;const l={};a.value.data.forEach(({id:i,relationships:o})=>{var c;const s=o.find(({type:d})=>d==="cover_art"),u=(c=s?.attributes)==null?void 0:c.fileName;u&&(l[i]=`https://mangadex.org/covers/${i}/${u}`)});const n=r.value.data.map(({relationships:i,attributes:o,id:c})=>{const s=i.find(({type:p})=>p==="manga"),u=typeof o.volume=="string"?+o.volume:void 0,d=typeof o.chapter=="string"?+o.chapter:void 0;if(d)return{slug:s.id,name:Object.values(s.attributes.title)[0],img:l[s.id],chapters:[{slug:o.externalUrl||c,label:o.title||void 0,vol:u,chap:d,lang:o.translatedLanguage,ts:new Date(o.readableAt).valueOf()}]}}).filter(Boolean);return Y({rawUpdates:Me(n),oldRawUpdates:e?.oldRawUpdates})}async function er(e){const t="https://api.comick.app/",[r]=await Promise.all([S(t,"chapter")]);if(!r)return;const a=r.value.chapters.map(l=>{var n,i;const{vol:o,chap:c,hid:s,lang:u,updated_at:d,md_comics:p}=l,f=typeof c=="string"&&!isNaN(+c)?+c:void 0;if(typeof f!="number")return;const g=(i=(n=p.md_covers)==null?void 0:n[0])==null?void 0:i.b2key;return{slug:p.hid,name:p.title,img:typeof g=="string"?`https://meo.comick.pictures/${g}`:void 0,chapters:[{slug:s,vol:typeof o=="string"&&!isNaN(+o)?+o:void 0,chap:f,lang:u,ts:new Date(d).valueOf()}]}}).filter(Boolean);return Y({rawUpdates:a,oldRawUpdates:e?.oldRawUpdates})}function Me(e){const t={};return e.forEach(r=>{Object.values(r.chapters.reduce((a,l)=>{const n=l.lang||"default";return a[n]||(a[n]=[]),a[n].push(l),a},{})).forEach(a=>{var l;const n=(l=a[0])==null?void 0:l.lang,i=`${r.slug}:${n||""}`;t[i]?(t[i].chapters.push(...a),se(t[i].chapters)):t[i]=r})}),Object.values(t)}function Y(e){var t;const r=Me(e.rawUpdates);if(r.length)return{type:w.update,url:(t=pe())!=null?t:"",newTitleBase:e.newTitleBase,rawUpdates:e.oldRawUpdates?Jt(r,e.oldRawUpdates):r}}var tr=Object.defineProperty,rr=Object.defineProperties,ar=Object.getOwnPropertyDescriptors,Te=Object.getOwnPropertySymbols,nr=Object.prototype.hasOwnProperty,lr=Object.prototype.propertyIsEnumerable,Ue=(e,t,r)=>t in e?tr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,G=(e,t)=>{for(var r in t||(t={}))nr.call(t,r)&&Ue(e,r,t[r]);if(Te)for(var r of Te(t))lr.call(t,r)&&Ue(e,r,t[r]);return e},Ae=(e,t)=>rr(e,ar(t));const Be=[{type:w.reader,builder:kt,fallback:!0},{type:w.title,builder:Tt,fallback:!0},{type:w.search,builder:Ft},{type:w.update,builder:Ne}];async function or(e){var t;const r=e.spec;if(r){const a=(t=e.siteMeta)!=null?t:r.meta;return await ee(Re(a,e.type).map(async({builder:l})=>{const n=await l({spec:r,siteMeta:a,tags:e.tags,oldRawUpdates:e.oldRawUpdates});return n?Ae(G({},n),{siteName:m(r.name)}):void 0}))}if(e.genericSpecs)return await ee(e.genericSpecs.map(a=>Re(a.meta).map(async({builder:l})=>{const n=await l({spec:a,siteMeta:a.meta,tags:e.tags});return n?Ae(G({},n),{siteName:m(a.name),specId:a.id,siteMeta:G({},a.meta)}):void 0})).flat())}function Re(e,t){const r=t??(e?ir(e):void 0);return r?Be.filter(a=>a.type===r):Be.filter(a=>a.fallback)}function ir(e){const t=location.pathname.split("?")[0].split("#")[0];if(t==="/")return;const r=e.titleBase,a=e.readerBase,l=a?.includes("{titleSlug}");if(a&&!l&&t.startsWith(`/${a}/`)||a&&l&&new RegExp(`^/${a.replace("{titleSlug}",".+")}/.+`).test(t))return w.reader;if(r&&t.startsWith("/"+r))return w.title}export{w as PageType,F as getImgNameFromUrl,or as getRawPageData,Ne as getRawUpdateData};
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(j,R){typeof exports=="object"&&typeof module<"u"?R(exports):typeof define=="function"&&define.amd?define(["exports"],R):(j=typeof globalThis<"u"?globalThis:j||self,R(j._trackkun_={}))})(this,function(j){"use strict";const R="webp",V=["jpg","jpng","png","webp","svg","gif","avif","apng","bmp"];function q(e){return`${Le(e)}.${R}`}function Le(e){const t=e.split("?")[0].split("#")[0].split("/").filter(Boolean),r=De(t.slice(-1)[0]);return r.length>=16?r:t.slice(0,-1).join("").slice(r.length-16)+r}function De(e){const t=Ce(e),r=t.replace(/-\d{3}x\d{3}$/,"");if(r!==t||t===e)return r;const a=t.split(".").reverse();if(a.length<3)return t;const[l,n,...i]=a;return!n||!V.includes(n)||!l||isNaN(+l)?t:i.reverse().join(".")}function Ce(e){const t=e.lastIndexOf(".");if(t===-1)return e;const r=e.substring(t+1);return V.includes(r)?e.substring(0,t):e}const We={text:ke,attr:_e,"attr-contain":ze,value:qe,row:Fe};function m(e,t={}){if(!e)return;const{root:r=document.documentElement,returnAll:a,preProcess:l}=t,n=X(e);if(n.length>1){for(let p=0;p<n.length;p+=1){const d=m(n[p],t);if(d!=null&&d.length)return d}return}const[i,o]=e.split("|");if(!o)return;const c=(o!=null&&o.startsWith("[")&&o.endsWith("]")?o.substring(1,o.length-1).split(","):[o]).map(p=>{const[d,f]=p.split(":");return{action:d,param:f}}),s=i?Array.from(r.querySelectorAll(i)):[r];if(!s.length)return a?[]:void 0;l&&l(s);const u=[];for(const p of s)for(const d of c){const f=We[d.action],g=f(p,d.param);if(g){if(a){u.push(g);break}return g}}return a?u:void 0}function ke(e){return Array.from(e.childNodes).filter(t=>t.nodeType===3).map(t=>M(t.textContent)).filter(Boolean).join(" ").trim()||M(e.textContent)}function _e(e,t){return M(e.getAttribute(t))}function ze(e,t){let r=e.getAttribute(t);if(!r){const a=e.getAttributeNames().find(l=>l.includes(t));a&&(r=e.getAttribute(a))}return M(r)}function X(e){const t=[],r=e.split("||").map(a=>a.trim()).filter(Boolean);return r.forEach((a,l)=>{if(a.includes("|")){t.push(a);return}const n=r[l+1];n&&(r[l+1]=`${a},${n}`)}),t}function qe(e){return e.value}function Fe(e,t){var r,a,l,n;if(!t||((r=M(e.textContent))==null?void 0:r.toLowerCase())!==t.toLowerCase())return;const i=Array.from((l=(a=e.parentElement)==null?void 0:a.childNodes)!=null?l:[]);return M((n=i[i.indexOf(e)+1])==null?void 0:n.textContent)}function M(e){if(e)return e?.replace(/(\n|\t)/g," ").trim()||void 0}function K(e){let t=!1;return new Promise((r,a)=>{Promise.all(e.map(async l=>{const n=await l;!t&&n&&(t=!0,r(n))})).then(()=>{t||r(void 0)})})}async function ee(e,t,r){const a=await r(()=>{e=0});if(a)return a;if(!(e<=0))return await new Promise(l=>{setTimeout(async()=>{const n=await ee(e-1,t,r);l(n)},t)})}async function L(e,t,r=0){var a;const l=(a=t.root)!=null?a:document.documentElement;return ee(t.lazy===!0?200:0,100,()=>{var n;const i=t.all===!0?Array.from(l.querySelectorAll(e)):(n=l.querySelector(e))!=null?n:void 0;return(t.all?!(i!=null&&i.length):!i)?void 0:i})}const He=/(vol(ume|\.)?\s*(\d+))/i,Qe=/(ch(ap(t(er)?|\.)?|\.)?|^#)\s*(\d+([_-~,.]\d+)?)/i,Ye=/\d+([_-~,.]\d+)?/,Ge=/[_-~,]/,Je=/^[^a-zA-Z0-9]*|[^a-zA-Z0-9]*$/g;function te(e,t){var r;if(!e||!e)return;if(!isNaN(+e))return{chap:+e};const a=e.match(He),l=a!=null&&a[0]?e.replace(a[0],"").trim():e,n=l.match(Qe),i=l.match(Ye),o=(r=n?.[5])!=null?r:i?.[0];if(!o)return;const c=+o.replace(Ge,".");if(isNaN(c))return;const s=a?.[3],u=s&&!isNaN(+s)?+s:void 0,p=l.replace((n||i)[0],"").replace(Je,""),d=t&&p.startsWith(t)?p.replace(t,""):p;return{vol:u,chap:c,label:d||void 0}}const re=[{regex:/(sec(ond(s)?)? ago|giây trước)/,seconds:1},{regex:/(min(s|ute(s)?)? ago|phút trước)/,seconds:60},{regex:/(hour(s)? ago|giờ trước)/,seconds:3600},{regex:/(day(s)? ago|ngày trước)/,seconds:86400},{regex:/(week(s)? ago|tuần trước)/,seconds:604800},{regex:/(month(s)? ago|tháng trước)/,seconds:2592e3},{regex:/(year(s)? ago|năm trước)/,seconds:31536e3}];function Ze(e){if(!e||e.includes("now"))return Date.now();if(e.includes("yesterday"))return Date.now()-864e5;const t=new Date(e);if(t instanceof Date){const r=t.valueOf();if(!isNaN(r))return t.getHours()===0&&t.getMinutes()===0?Math.min(Date.now(),r+432e5):r}for(let r=0;r<re.length;r++){const{regex:a,seconds:l}=re[r];if(a.test(e)){const n=e.split(" ").slice(-3)[0],i=n=="an"||n==="a"?1:+n;if(isNaN(i)||i<0)return;const o=Date.now()-i*l*1e3;return o>0?o:void 0}}}function ae(e,t){if(!e)return"/";const r=e.replace("{titleSlug}",t),a=r.endsWith("/")?r:r+"/";return a.startsWith("/")?a:"/"+a}var Ve=(e=>(e[e.reading=1]="reading",e[e.paused=2]="paused",e[e.plan=3]="plan",e[e.completed=4]="completed",e[e.dropped=5]="dropped",e[e.deleted=6]="deleted",e))(Ve||{}),D=(e=>(e[e.none=0]="none",e[e.removeLastSegment=1]="removeLastSegment",e[e.removeIdAfterLastDash=2]="removeIdAfterLastDash",e[e.removeIdBeforeFirstDash=3]="removeIdBeforeFirstDash",e))(D||{}),ne=(e=>(e[e.none=0]="none",e[e.removePage=1]="removePage",e))(ne||{}),Xe=(e=>(e[e.string=1]="string",e[e.number=2]="number",e[e.bool=3]="bool",e[e.selection=4]="selection",e))(Xe||{}),Ke=(e=>(e[e.SiteUpdate=1]="SiteUpdate",e[e.SiteTitleImg=2]="SiteTitleImg",e))(Ke||{});function et(e,{removeTrailingSlash:t=!0}={}){if(!e)return;const r=t&&e.endsWith("/")?e.slice(0,-1):e;try{return new URL(r)}catch{return}}function B(e){var t;if(!(!e||typeof e!="string"))return e.startsWith("http://")||e.startsWith("https://")?(t=et(e))==null?void 0:t.pathname:e}function F({basePath:e,url:t,siteMeta:r}){const a=B(t);if(!a)return;const l=a.replace(e,"");switch(r.readerSlugTransformer){case ne.removePage:return l.replace(/-page-\d{1,3}\.html$/,".html");default:return l}}var tt=Object.defineProperty,rt=Object.defineProperties,at=Object.getOwnPropertyDescriptors,le=Object.getOwnPropertySymbols,nt=Object.prototype.hasOwnProperty,lt=Object.prototype.propertyIsEnumerable,oe=(e,t,r)=>t in e?tt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,ot=(e,t)=>{for(var r in t||(t={}))nt.call(t,r)&&oe(e,r,t[r]);if(le)for(var r of le(t))lt.call(t,r)&&oe(e,r,t[r]);return e},it=(e,t)=>rt(e,at(t));async function C(e,{root:t=document.documentElement,titleSlug:r="",titleName:a,lazy:l=!0,siteMeta:n}){var i;if(!e)return;const o=[],c=await L(e.sel,{root:t,all:!0,lazy:l});if(!(c!=null&&c.length))return o;const s=(c??[]).map(f=>({label:m(e.label,{root:f}),url:m(e.url,{root:f}),at:m(e.at,{root:f})})),u=s.map(({label:f})=>te(f,a)),p=(i=u[1])==null?void 0:i.chap;!u[0]&&(p===void 0||p<=1)&&(u[0]={label:s[0].label,chap:0});const d=ae(n.readerBase,r);return u.forEach((f,g)=>{var v;if(!f)return;const{url:h,at:y}=s[g],O=F({basePath:d,url:h,siteMeta:n});O&&o.push(it(ot({},f),{slug:O,ts:Ze(y)||((v=o[o.length+1])==null?void 0:v.ts)||Date.now()}))}),ie(o),o}function ie(e){e.sort((t,r)=>{var a,l;return((a=r.vol)!=null?a:0)-((l=t.vol)!=null?l:0)||r.chap-t.chap})}function W({url:e,siteMeta:t}){var r;if(typeof e!="string")return;const a=t.titleSlugTransformer,l=(r=B(e))==null?void 0:r.split("/").filter(Boolean);if(!l||!l.length)return e;const n=l[l.length-1];switch(a){case D.removeLastSegment:return l.length>=2?l[l.length-2]:n;case D.removeIdAfterLastDash:{const i=n.lastIndexOf("-"),o=+n.substring(i+1);return i===-1||isNaN(o)||o<1e4?n:n.substring(0,i)}case D.removeIdBeforeFirstDash:{const i=n.indexOf("-"),o=+n.substring(0,i);return i===-1||isNaN(o)||o<1e3?n:n.substring(i+1)}default:return n}}function st(){return Math.random().toString(16).slice(2)}async function ut({addListener:e,removeListener:t,transform:r,filter:a,handler:l,onTimeout:n,timeout:i,once:o}){return new Promise(c=>{e(p);const s=()=>o===!0&&t(p),u=i?setTimeout(()=>{s(),c(void 0),n?.()},i):void 0;async function p(d,...f){d=r?r(d):d,d!==void 0&&(!a||a(d,...f))&&(s(),c(d),l?.(d,...f),u&&clearTimeout(u))}})}var ct=Object.defineProperty,se=Object.getOwnPropertySymbols,dt=Object.prototype.hasOwnProperty,pt=Object.prototype.propertyIsEnumerable,ue=(e,t,r)=>t in e?ct(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,ft=(e,t)=>{for(var r in t||(t={}))dt.call(t,r)&&ue(e,r,t[r]);if(se)for(var r of se(t))pt.call(t,r)&&ue(e,r,t[r]);return e};async function gt(e){const t=await ut(ft({addListener:r=>window.addEventListener("message",r),removeListener:r=>window.removeEventListener("message",r)},e));return t?.data}async function mt(e){var t;const{receiverWindow:r,timeout:a,targetOrigin:l,event:n,args:i}=e,o={reqId:st(),event:n,args:i};(t=r||window)==null||t.postMessage(o,l??"*");const c=await gt({filter:s=>{var u;return((u=s?.data)==null?void 0:u.resId)===o.reqId},timeout:a??3e4,once:!0});return c?.result}const T={isAny:!0};function S(e,...t){return mt({event:"tk:fetchResult",args:{baseUrl:e,segments:t}})}const vt='meta[property="og:url"]|attr:content,meta[name="url"]|attr:content';function ce(e=document.documentElement){try{return window.location.origin+window.location.pathname}catch{}const t=m(vt,{root:e});if(!(!t||B(t)==="/"))return t}function de(e,t){if(!(t!=null&&t.length))return;const r={};e.forEach(({id:l,name:n,altNames:i})=>{r[H(n)]=l,i&&i.forEach(o=>{r[H(o)]=l})});const a=t.map(l=>r[H(l)]).filter(Boolean);return a.length===0?void 0:Array.from(new Set(a)).sort((l,n)=>l-n)}function H(e){const t=e.toLowerCase().replaceAll(" ","");return t[t.length-1]==="s"?t.substring(0,t.length-1):t}var w=(e=>(e.title="title",e.reader="reader",e.update="update",e.search="search",e))(w||{}),ht=Object.defineProperty,yt=Object.defineProperties,bt=Object.getOwnPropertyDescriptors,pe=Object.getOwnPropertySymbols,wt=Object.prototype.hasOwnProperty,Ot=Object.prototype.propertyIsEnumerable,fe=(e,t,r)=>t in e?ht(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,k=(e,t)=>{for(var r in t||(t={}))wt.call(t,r)&&fe(e,r,t[r]);if(pe)for(var r of pe(t))Ot.call(t,r)&&fe(e,r,t[r]);return e},ge=(e,t)=>yt(e,bt(t));async function Pt({spec:e,siteMeta:t,tags:r}){var a,l;if(e.id=="mangadex")return await St({tags:r});if(!(e!=null&&e.title))return;const{sel:n,name:i,img:o,chapter:c,langs:s,tags:u,type:p}=e.title;if(!n||!i||!c||!await L(n,{lazy:(a=e.title.lazy)!=null?a:!1}))return;const d=m(i);if(!d)return;const f=W({url:ce(),siteMeta:t});if(!f)return;const g=(l=m(u,{returnAll:!0}))!=null?l:[],v=m(p),h={type:w.title,url:location.origin+location.pathname,slug:f,name:d,langs:m(s,{returnAll:!0}),tags:de(r,[...g??[],...v?[v]:[]]),imgUrl:m(o),chapters:[]};return e.id==="comick"?k(k({},h),await $t()):ge(k({},h),{chapters:await C(c,{siteMeta:t,lazy:!0,titleSlug:f,titleName:d})})}async function $t(){const e="https://api.comick.app/",[t]=await Promise.all([S(e,"comic",T,"chapters")]);if(!t)return{};const r=t.value,a=r.chapters.map(l=>{const{vol:n,chap:i,hid:o,lang:c,updated_at:s}=l,u=typeof i=="string"&&!isNaN(+i)?+i:void 0;if(typeof u=="number")return{slug:o,vol:typeof n=="string"&&!isNaN(+n)?+n:void 0,chap:u,lang:c,ts:new Date(s).valueOf()}}).filter(Boolean);return{hasMoreChapters:r.chapters.length<r.total,chapters:a}}async function St({tags:e}){var t,r,a;const l="https://api.mangadex.org/manga/",[n,i]=await Promise.all([S(l,T),S(l,T,"feed")]);if(!n||!i)return;const o=(a=(r=(t=i.value.data)==null?void 0:t.map)==null?void 0:r.call(t,u=>{const{attributes:p,id:d}=u;if(typeof p!="object"||typeof d!="string"||!d)return;const{externalUrl:f,title:g,volume:v,chapter:h,translatedLanguage:y}=p;return{slug:f||d,label:g||void 0,vol:typeof v=="string"?+v:void 0,chap:typeof h=="string"?+h:void 0,lang:y||"en",ts:new Date(p.readableAt).valueOf()}}).filter(u=>u?.chap!=null))!=null?a:[],{data:c}=n.value;if(!c)return;const s=me({data:c,entryTags:e});if(s)return ge(k({},s),{chapters:o,hasMoreChapters:(i.value.total||0)>(i.value.limit||0)})}function me({data:e,entryTags:t}){var r,a,l,n,i;const{id:o,attributes:c,relationships:s}=e;if(!o||typeof o!="string"||typeof c!="object")return;const{title:u,availableTranslatedLanguages:p,altTitles:d,tags:f,restrictedContent:g}=c;if(typeof u!="object"||!Array.isArray(p))return;const v=Object.values(u)[0];if(!v||typeof v!="string")return;const h=jt(),y=(a=(r=p?.map)==null?void 0:r.call(p,b=>typeof b=="string"?b:void 0).filter(Boolean))!=null?a:[],O=y.filter(b=>b&&(!h||h.includes(b))),x=(l=d?.map)==null?void 0:l.call(d,b=>{const[[N,U]=[]]=Object.entries(b);return{lang:N,name:U}}),P=(n=s?.find)==null?void 0:n.call(s,b=>b.type==="cover_art"),I=(i=P?.attributes)==null?void 0:i.fileName,E=I?`https://mangadex.org/covers/${o}/${I}`:void 0,G=(f||[]).map(b=>{var N,U;return(U=(N=b?.attributes)==null?void 0:N.name)==null?void 0:U.en}).concat(g).filter(Boolean);return{type:w.title,url:`${location.origin}/title/${o}`,slug:o,name:v,altNames:x,langs:O.length>0?O:y,imgUrl:E,tags:de(t,G),isWebtoon:f?.some(b=>b.attributes.name.en==="Long Strip")}}function jt(){var e;const t=localStorage.getItem("md");if(t)try{const r=JSON.parse(t),a=(e=r?.userPreferences)==null?void 0:e.filteredLanguages;return a!=null&&a.length?a:void 0}catch{return}}var xt=Object.defineProperty,Nt=Object.defineProperties,Mt=Object.getOwnPropertyDescriptors,ve=Object.getOwnPropertySymbols,Tt=Object.prototype.hasOwnProperty,Ut=Object.prototype.propertyIsEnumerable,he=(e,t,r)=>t in e?xt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,At=(e,t)=>{for(var r in t||(t={}))Tt.call(t,r)&&he(e,r,t[r]);if(ve)for(var r of ve(t))Ut.call(t,r)&&he(e,r,t[r]);return e},Rt=(e,t)=>Nt(e,Mt(t));async function Bt({spec:e,siteMeta:t,tags:r}){var a,l;if(e.id=="mangadex")return await Lt({entryTags:r});if(!(e!=null&&e.reader)||!await Et(e.reader))return;const n=await It({spec:e,siteMeta:t});if(!n)return;const{name:i,slug:o,chapters:c}=n,s=(a=m(e.reader.label))==null?void 0:a.toLowerCase().replace(i.toLowerCase(),"");if(!s)return;const{vol:u,chap:p=0}=te(s,i)||{};let d;const f=(l=m(e.reader.img,{returnAll:!0,preProcess(v){const h=v.map(y=>+(y.getAttribute("height")||0)/+(y.getAttribute("width")||1));h.some(y=>y>2.5)?d=!0:h.filter(Boolean).length>Math.max(1,h.length-2)&&(d=!1)}}))!=null?l:[];if(!f.length)return;const g=ae(t.readerBase,o);return{type:w.reader,url:location.origin+location.pathname,isWebtoon:d,vol:u,chap:p,lang:m(e.reader.lang),slug:F({basePath:g,url:location.pathname,siteMeta:t}),nextSlug:ye({sel:e.reader.next,basePath:g,siteMeta:t}),prevSlug:ye({sel:e.reader.prev,basePath:g,siteMeta:t}),basePath:g,imgs:f,title:{type:w.title,url:n.url,slug:o,name:i,chapters:c}}}async function It({spec:e,siteMeta:t}){var r,a;const{sel:l,name:n,url:i}=e.reader.title||{};if(!l||!n||!i)return;const o=document.querySelector(l);if(!(o instanceof HTMLElement))return;const c=m(n,{root:o}),s=m(i,{root:o}),u=W({url:s,siteMeta:t});if(!(!c||!s||!u))return{type:w.title,url:s,name:c,slug:u,chapters:(a=await C((r=e.reader)==null?void 0:r.chapter,{titleSlug:u,titleName:c,siteMeta:t}))!=null?a:[]}}function ye({sel:e,basePath:t,siteMeta:r}){const a=m(e);if(!(!a||a.startsWith("#")||a.startsWith("/#")))return F({basePath:t,url:a,siteMeta:r})}async function Et(e){const{sel:t,img:r}=e;if(!t||!r||!document.querySelector(t))return!1;const a=X(r).map(l=>l.split("|")[0]).join(",");return!!await L(a,{root:document.documentElement,lazy:!0,all:!1})}async function Lt({entryTags:e}){var t,r,a,l,n,i,o,c,s,u,p,d,f,g,v;const h="https://api.mangadex.org/",[y,O,x]=await Promise.all([S(h,"chapter",T),S(h,"at-home","server",T),S(h,"manga",T,"aggregate")]);if(!y||!O||!x)return;const P=y.value.data,{volume:I,chapter:E,externalUrl:G,translatedLanguage:b}=P.attributes||{},{baseUrl:N,chapter:{data:U,dataSaver:tr,hash:rr}}=O.value,Be=(r=(t=P.relationships)==null?void 0:t.find)==null?void 0:r.call(t,$=>$.type==="manga");if(!Be)return;const J=me({data:Be,entryTags:e});if(!J||typeof((a=x.value)==null?void 0:a.volumes)!="object")return;const A=Object.values(x.value.volumes).map(({volume:$,chapters:or})=>{const ir=$==="none"||typeof $!="string"?void 0:+$;return Object.values(or).map(({id:sr,chapter:Z})=>typeof Z!="string"||Z==="none"?void 0:{vol:ir,chap:+Z,slug:sr})}).flat().filter(Boolean).reverse();if(typeof E!="string"||E==="none"){if(A.length)return;A.push({chap:0,slug:P.id})}const Ie=A.findIndex($=>$.slug===P.id),z=(n=(l=P.relationships)==null?void 0:l.find)==null?void 0:n.call(l,$=>$.type==="scanlation_group"),ar=N.endsWith("/")?N:N+"/",Ee=!!((o=(i=localStorage.getItem("md"))==null?void 0:i.includes)!=null&&o.call(i,'"dataSaver":true')),nr=`${ar}${Ee?"data-saver":"data"}/`,lr=(p=(u=(s=(c=Ee?tr:U)!=null?c:[]).map)==null?void 0:u.call(s,$=>`${nr}${rr}/${$}`))!=null?p:[];return{type:w.reader,url:location.origin+location.pathname,externalUrl:G,vol:typeof I=="string"?+I:void 0,chap:+E||0,imgs:lr,lang:b,slug:P.id,prevSlug:(d=A[Ie+1])==null?void 0:d.slug,nextSlug:(f=A[Ie-1])==null?void 0:f.slug,basePath:"/chapter/",groupName:(g=z?.attributes)==null?void 0:g.name,groupUrl:(v=z?.attributes)==null?void 0:v.website,title:Rt(At({},J),{langs:b?[b]:J.langs,chapters:A})}}function be(e){if(e.length<=1)return;const t=e.slice(0,30).map(n=>n.split("/").filter(Boolean).slice(0,-1)),r=t[0],a=r.length;if(!a)return;const l=[];for(let n=0;n<a;n++){const i=r[n];if(!t.every(o=>o[n]===i))break;l.push(i)}if(l.length)return l.join("/")}async function Dt({spec:e,siteMeta:t}){var r;const a=(r=e.search)==null?void 0:r.title;if(!a)return;const{chapter:l}=a,n=[];if(await new Promise(o=>setTimeout(o,3e3)),await Promise.all(Array.from(document.querySelectorAll(a.sel)).map(async o=>{var c;const s=m(a.url,{root:o}),u=B(s);if(!u)return;const p=m(a.name,{root:o});if(!p)return;const d=m(a.img,{root:o}),f=d?q(d):void 0,g=W({url:u,siteMeta:t});g&&n.push({path:u,slug:g,img:f,name:p,chapters:(c=await C(l,{root:o,siteMeta:t,titleSlug:g,titleName:p}))!=null?c:[]})})),!n.length)return;const i=be(n.map(o=>o.path));return{type:w.search,url:location.origin+location.pathname,rawUpdates:n,newTitleBase:i!==t.titleBase?i:void 0}}var Ct=Object.defineProperty,we=Object.getOwnPropertySymbols,Wt=Object.prototype.hasOwnProperty,kt=Object.prototype.propertyIsEnumerable,Oe=(e,t,r)=>t in e?Ct(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,_t=(e,t)=>{for(var r in t||(t={}))Wt.call(t,r)&&Oe(e,r,t[r]);if(we)for(var r of we(t))kt.call(t,r)&&Oe(e,r,t[r]);return e};function zt(e,t){var r,a;const l=[...t],n=[];let i=-1,o=-1;for(let s=0;s<e.length&&!(!l.length&&s>=10);s++){const u=_t({},e[s]),p=l.findIndex(g=>g.slug===u.slug&&g.name===u.name),d=p===-1?void 0:l.splice(p,1)[0],f=!d||((r=d.chapters[0])==null?void 0:r.chap)!==((a=u.chapters[0])==null?void 0:a.chap);p!==-1&&(o=s),f&&(i=s,u.changed=!0),n.push(u)}if(i===-1)return[];if(l.length){const s=Math.max(10,o+1);n.splice(s);for(let u=o+1;u<n.length;u++)n[u].changed=!1;return n}const c=Math.min(Math.max(i+1,10),Math.max(o+1,50));return n.slice(0,c)}var qt=Object.defineProperty,_=Object.getOwnPropertySymbols,Pe=Object.prototype.hasOwnProperty,$e=Object.prototype.propertyIsEnumerable,Se=(e,t,r)=>t in e?qt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Ft=(e,t)=>{for(var r in t||(t={}))Pe.call(t,r)&&Se(e,r,t[r]);if(_)for(var r of _(t))$e.call(t,r)&&Se(e,r,t[r]);return e},je=(e,t)=>{var r={};for(var a in e)Pe.call(e,a)&&t.indexOf(a)<0&&(r[a]=e[a]);if(e!=null&&_)for(var a of _(e))t.indexOf(a)<0&&$e.call(e,a)&&(r[a]=e[a]);return r};async function xe(e){return e.spec.id=="mangadex"?await Qt(e):e.spec.id=="comick"?await Yt(e):await Ht(e)}async function Ht({spec:e,siteMeta:t,root:r,lazy:a,oldRawUpdates:l}){var n;if(!((n=e?.update)!=null&&n.title))return;const i=e.update.title,{chapter:o}=i,c=je(i,["chapter"]);if(!c.sel||!c.name||!(o!=null&&o.sel)||!(o!=null&&o.label))return;const s=await L(c.sel,{root:r,lazy:a??!0,all:!0});if(!(s!=null&&s.length))return;const u=s.map(f=>{const g=m(c.url,{root:f}),v=B(g);if(!v)return;const h=m(c.name,{root:f});if(!h)return;const y=m(c.img,{root:f}),O=y?q(y):void 0;return{titleEl:f,path:v,img:O,name:h}}).filter(Boolean);if(!u.length)return;const p=be(u.map(f=>f.path)),d=await Promise.all(u.map(async f=>{var g;const v=f,{path:h,titleEl:y}=v,O=je(v,["path","titleEl"]),x=W({url:h,siteMeta:t}),P=(g=await C(o,{siteMeta:t,root:y,titleSlug:x,titleName:O?.name}))!=null?g:[];return Ft({slug:x,chapters:P},O)}));return Q({newTitleBase:p&&p!==t.titleBase?p:void 0,rawUpdates:d,oldRawUpdates:l})}async function Qt(e){const t="https://api.mangadex.org/",[r,a]=await Promise.all([S(t,"chapter"),S(t,"manga")]);if(!a||!r)return;const l={};a.value.data.forEach(({id:i,relationships:o})=>{var c;const s=o.find(({type:p})=>p==="cover_art"),u=(c=s?.attributes)==null?void 0:c.fileName;u&&(l[i]=`https://mangadex.org/covers/${i}/${u}`)});const n=r.value.data.map(({relationships:i,attributes:o,id:c})=>{const s=i.find(({type:d})=>d==="manga"),u=typeof o.volume=="string"?+o.volume:void 0,p=typeof o.chapter=="string"?+o.chapter:void 0;if(p)return{slug:s.id,name:Object.values(s.attributes.title)[0],img:l[s.id],chapters:[{slug:o.externalUrl||c,label:o.title||void 0,vol:u,chap:p,lang:o.translatedLanguage,ts:new Date(o.readableAt).valueOf()}]}}).filter(Boolean);return Q({rawUpdates:Ne(n),oldRawUpdates:e?.oldRawUpdates})}async function Yt(e){const t="https://api.comick.app/",[r]=await Promise.all([S(t,"chapter")]);if(!r)return;const a=r.value.chapters.map(l=>{var n,i;const{vol:o,chap:c,hid:s,lang:u,updated_at:p,md_comics:d}=l,f=typeof c=="string"&&!isNaN(+c)?+c:void 0;if(typeof f!="number")return;const g=(i=(n=d.md_covers)==null?void 0:n[0])==null?void 0:i.b2key;return{slug:d.hid,name:d.title,img:typeof g=="string"?`https://meo.comick.pictures/${g}`:void 0,chapters:[{slug:s,vol:typeof o=="string"&&!isNaN(+o)?+o:void 0,chap:f,lang:u,ts:new Date(p).valueOf()}]}}).filter(Boolean);return Q({rawUpdates:a,oldRawUpdates:e?.oldRawUpdates})}function Ne(e){const t={};return e.forEach(r=>{Object.values(r.chapters.reduce((a,l)=>{const n=l.lang||"default";return a[n]||(a[n]=[]),a[n].push(l),a},{})).forEach(a=>{var l;const n=(l=a[0])==null?void 0:l.lang,i=`${r.slug}:${n||""}`;t[i]?(t[i].chapters.push(...a),ie(t[i].chapters)):t[i]=r})}),Object.values(t)}function Q(e){var t;const r=Ne(e.rawUpdates);if(r.length)return{type:w.update,url:(t=ce())!=null?t:"",newTitleBase:e.newTitleBase,rawUpdates:e.oldRawUpdates?zt(r,e.oldRawUpdates):r}}var Gt=Object.defineProperty,Jt=Object.defineProperties,Zt=Object.getOwnPropertyDescriptors,Me=Object.getOwnPropertySymbols,Vt=Object.prototype.hasOwnProperty,Xt=Object.prototype.propertyIsEnumerable,Te=(e,t,r)=>t in e?Gt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Y=(e,t)=>{for(var r in t||(t={}))Vt.call(t,r)&&Te(e,r,t[r]);if(Me)for(var r of Me(t))Xt.call(t,r)&&Te(e,r,t[r]);return e},Ue=(e,t)=>Jt(e,Zt(t));const Ae=[{type:w.reader,builder:Bt,fallback:!0},{type:w.title,builder:Pt,fallback:!0},{type:w.search,builder:Dt},{type:w.update,builder:xe}];async function Kt(e){var t;const r=e.spec;if(r){const a=(t=e.siteMeta)!=null?t:r.meta;return await K(Re(a,e.type).map(async({builder:l})=>{const n=await l({spec:r,siteMeta:a,tags:e.tags,oldRawUpdates:e.oldRawUpdates});return n?Ue(Y({},n),{siteName:m(r.name)}):void 0}))}if(e.genericSpecs)return await K(e.genericSpecs.map(a=>Re(a.meta).map(async({builder:l})=>{const n=await l({spec:a,siteMeta:a.meta,tags:e.tags});return n?Ue(Y({},n),{siteName:m(a.name),specId:a.id,siteMeta:Y({},a.meta)}):void 0})).flat())}function Re(e,t){const r=t??(e?er(e):void 0);return r?Ae.filter(a=>a.type===r):Ae.filter(a=>a.fallback)}function er(e){const t=location.pathname.split("?")[0].split("#")[0];if(t==="/")return;const r=e.titleBase,a=e.readerBase,l=a?.includes("{titleSlug}");if(a&&!l&&t.startsWith(`/${a}/`)||a&&l&&new RegExp(`^/${a.replace("{titleSlug}",".+")}/.+`).test(t))return w.reader;if(r&&t.startsWith("/"+r))return w.title}j.PageType=w,j.getImgNameFromUrl=q,j.getRawPageData=Kt,j.getRawUpdateData=xe});
|
package/init.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(function(){"use strict";async function W({addListener:n,removeListener:e,transform:t,filter:l,handler:a,onTimeout:r,timeout:o,once:i}){return new Promise(d=>{n(w);const c=()=>i===!0&&e(w),u=o?setTimeout(()=>{c(),d(void 0),r?.()},o):void 0;async function w(s,...S){s=t?t(s):s,s!==void 0&&(!l||l(s,...S))&&(c(),d(s),a?.(s,...S),u&&clearTimeout(u))}})}var L=Object.defineProperty,v=Object.getOwnPropertySymbols,T=Object.prototype.hasOwnProperty,E=Object.prototype.propertyIsEnumerable,f=(n,e,t)=>e in n?L(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,I=(n,e)=>{for(var t in e||(e={}))T.call(e,t)&&f(n,t,e[t]);if(v)for(var t of v(e))E.call(e,t)&&f(n,t,e[t]);return n};async function y(n){const e=await W(I({addListener:t=>window.addEventListener("message",t),removeListener:t=>window.removeEventListener("message",t)},n));return e?.data}function M({event:n,filter:e,handler:t,senderWindow:l,targetOrigin:a}){y({filter:r=>{var o,i;return((o=r.data)==null?void 0:o.event)===n&&!!((i=r.data)!=null&&i.reqId)&&(!e||e(r))},handler:async r=>{const o=await t?.(r);(l||window).postMessage({resId:r.data.reqId,result:o},a??"*")}})}function k(){return Math.random().toString(16).slice(2)}async function h(n){var e;const{receiverWindow:t,timeout:l,targetOrigin:a,event:r,args:o}=n,i={reqId:k(),event:r,args:o};(e=t||window)==null||e.postMessage(i,a??"*");const d=await y({filter:c=>{var u;return((u=c?.data)==null?void 0:u.resId)===i.reqId},timeout:l??3e4,once:!0});return d?.result}async function g(n,e,t){const l=await t(()=>{n=0});if(l)return l;if(!(n<=0))return await new Promise(a=>{setTimeout(async()=>{const r=await g(n-1,e,t);a(r)},e)})}var x=Object.defineProperty,m=Object.getOwnPropertySymbols,A=Object.prototype.hasOwnProperty,R=Object.prototype.propertyIsEnumerable,b=(n,e,t)=>e in n?x(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,O=(n,e)=>{for(var t in e||(e={}))A.call(e,t)&&b(n,t,e[t]);if(m)for(var t of m(e))R.call(e,t)&&b(n,t,e[t]);return n};const p="tk:loadingPlaceholder",P=()=>{var n;return window.top&&window.top!=window&&((n=location.ancestorOrigins[0])==null?void 0:n.startsWith("chrome-extension://"))},j={delay:p};q();function q(){P()||B(()=>{var a;h({event:"tk:spaNavigation",args:{}}),(a=window.flutter_inappwebview)==null||a.callHandler("tk:spaNavigation",{})});let n=location.origin+location.pathname,e=O({},j);const t=U();async function l(a,r){if(r.headers.get("Content-Type")!=="application/json"){delete e[a];return}e[a]=r.clone()}window.fetch=new Proxy(window.fetch,{apply:async(a,r,o)=>{var i,d;n!==location.origin+location.pathname&&(n=location.origin+location.pathname,e=O({},j));const[c,u]=o;if(u!=null&&u.method&&((d=(i=u.method).toLowerCase)==null?void 0:d.call(i))!=="get")return await a.apply(r,o);const w=C(c,await t);return e[w]=p,delete e.delay,await a.apply(r,[w,u]).then(s=>(l(w,s),s)).catch(s=>{throw delete e[w],s})}}),M({event:"tk:fetchResult",async handler(a){const{baseUrl:r,segments:o}=a.data.args||{};return!Array.isArray(o)||typeof r!="string"?void 0:await N(()=>e,r,o.filter(i=>typeof i=="string"||typeof i?.isAny=="boolean"))}})}function N(n,e,t){let l=15;return g(150,100,async a=>{const r=n(),o=Object.keys(r).find(c=>{if(!c.startsWith(e))return;const u=c.replace(e,"").split("?")[0].split("#")[0].split("/").filter(Boolean);return u.length===t.length&&t.every((w,s)=>w?.isAny||w===u[s])});if(!o){const c=Object.values(r);!(!c.length||c.includes(p))&&!--l&&a();return}const i=r[o];if(i===p)return;const d=await _(i);return d===void 0?void 0:{url:o,value:d}})}async function U(){if(window._fetchOverrides)return window._fetchOverrides;if(P())return await h({event:"getFetchOverrides",args:{},timeout:3e3,receiverWindow:window.top})}function C(n,e){if(!(e!=null&&e.length))return n;const t=new URL(n.endsWith("/")?n.slice(0,-1):n),l=t.host+t.pathname,a=e.find(o=>new RegExp(o.match).test(l));if(!a)return n;const r=new URLSearchParams(t.search);return a.params.forEach(({key:o,value:i})=>{i?o.endsWith("[]")?r.append(o,i):r.set(o,i):r.delete(o)}),t.search=r.toString(),t.href}async function _(n){try{return await n.json()}catch{}try{const e=await n.text();return JSON.parse(e)}catch{}}function B(n){let e=location.pathname;const t=F(()=>{e!==location.pathname&&(e=location.pathname,n())},50),l=(a,r,o)=>(t(),a.apply(r,o));window.addEventListener("popstate",t),window.history.pushState=new Proxy(window.history.pushState,{apply:l}),window.history.replaceState=new Proxy(window.history.replaceState,{apply:l})}function F(n,e){let t;return()=>{t&&clearTimeout(t),t=setTimeout(()=>{n(),t=void 0},e)}}})();
|
package/package.json
ADDED
package/specs.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"id":"mangastream","generic":true,"name":"meta[itemprop=\"name\"]|attr:content","meta":{"updatePath":"","readerBase":"","titleBase":"series","searchPath":"?s=","defaultLang":"en"},"update":{"title":{"sel":".listupd .utao .uta, .bixbox .bs.styletere","name":"h4, .info .tt, .tt a|text","url":"a|attr:href","img":".imgu img, .limit img|attr-contain:src","chapter":{"sel":".luf ul li, .chapter-list > a, .chfiv > li","label":"a, .epxs|text","url":"a|attr:href || |attr:href","at":"a + span, .expdate, .newchtimeluffy|text"}}},"title":{"sel":"#chapterlist > ul","name":"h1.entry-title|text","img":".thumb img|attr-contain:src","type":".imptdt a[href*=\"type=\"]|text || .imptdt:first-of-type i|text","tags":".postbody .mgen > a|text","chapter":{"sel":"#chapterlist > ul > li","url":"a|attr:href","label":".chapternum|text","at":".chapterdate|text"}},"reader":{"sel":"#readerarea","label":"h1.entry-title|text","img":"#readerarea > p > img,#readerarea > img|attr-contain:src","title":{"sel":".headpost .allc","name":"a|text","url":"a|attr:href"},"prev":"a.ch-prev-btn:not(.disabled)|attr:href","next":"a.ch-next-btn:not(.disabled)|attr:href","chapter":{"sel":".ctop option:not([disabled]):not([value=\"\"])","label":"|text","url":"|attr:value"}},"search":{"title":{"sel":".listupd .bsx","name":".bigor .tt|text","url":"a|attr:href","img":".limit img|attr-contain:src"}}},{"id":"madara","generic":true,"name":"a.logo|attr:title || meta[property=\"og:site_name\"]|attr:content","meta":{"updatePath":"","titleBase":"manga","readerBase":"manga/{titleSlug}","searchPath":"?post_type=wp-manga&s=","defaultLang":"en"},"update":{"title":{"sel":".page-listing-item .page-item-detail","name":"h3 a|text","url":"a|attr:href","img":"img|attr-contain:src","chapter":{"sel":".chapter-item","label":".chapter a|text","url":".chapter a|attr:href","at":".c-new-tag|attr:title || .post-on|text"}}},"title":{"lazy":true,"sel":".listing-chapters_wrap, #manga-chapters-holder","name":"h1|text","img":".summary_image .img-responsive|[attr:data-src,attr-contain:src]","tags":"a[rel=\"tag\"][href*=\"genre\"],a[rel=\"tag\"][href*=\"tag\"]|text","type":".post-content_item .summary-heading|row:type","chapter":{"sel":"li.wp-manga-chapter","url":"a|attr:href","label":"a|text","at":".c-new-tag|attr:title || .chapter-release-date i|text"}},"reader":{"sel":".entry-content .read-container","label":".breadcrumb li.active|text","img":".reading-content img|[attr:data-src,attr-contain:src]","title":{"sel":".breadcrumb li:nth-last-child(2) a","name":"|text","url":"|attr:href"},"prev":"a.btn.prev_page|attr:href","next":"a.btn.next_page|attr:href","chapter":{"sel":"#manga-reading-nav-head select.single-chapter-select > option:not([disabled])","label":"|text","url":"|attr:data-redirect"}},"search":{"title":{"sel":".c-tabs-item__content","name":"h3 a|text","url":"a|attr:href","img":".tab-thumb img|attr-contain:src","chapter":{"sel":".tab-meta","label":".chapter a|text","url":".chapter a|attr:href","at":".c-new-tag|attr:title || .post-on|text"}}}},{"id":"mangaHub","name":".navbar-brand img.logo|attr:alt","meta":{"updatePath":"","titleBase":"manga","readerBase":"chapter/{titleSlug}","searchPath":"search?q=","defaultLang":"en"},"update":{"title":{"sel":".list-group-item .media","name":".media-heading h4 a|text","img":".media-left img|attr-contain:src","url":".media-heading a|attr:href","chapter":{"sel":".media-body","label":".media-heading + a span:last-child|text","url":".media-heading + a|attr:href","at":".media-heading .small|text"}}},"title":{"sel":"#chapters-tab .tab-content","name":"#mangadetail h1|text","img":"#mangadetail img.manga-thumb|attr-contain:src","chapter":{"sel":"#chapters-tab li.list-group-item","label":"a span:first-child span:last-child|text","url":"a|attr:href","at":"small|text"}},"reader":{"sel":"#mangareader","label":"h3|text","img":"#mangareader div img[alt]|attr-contain:src","next":".chapter-pager .next:not(.disabled) a|attr:href","prev":".chapter-pager .previous:not(.disabled) a|attr:href","title":{"sel":"h3 a","name":"|text","url":"|attr:href"},"chapter":{"sel":".pager-dropdown .dropdown-menu > li > a","label":"|text","url":"|attr:href"}},"search":{"title":{"sel":".media-manga","name":"h4 a|text","img":".media-left img|attr-contain:src","url":"h4 a|attr:href","chapter":{"sel":".media-body","label":"a[href*=\"/chapter/\"]|text","url":"a[href*=\"/chapter/\"]|attr:href"}}}},{"id":"manhwafreak","name":"meta[itemprop=\"name\"],meta[property=\"og:site_name\"]|attr:content","meta":{"updatePath":"","titleBase":"manga","readerBase":"","searchPath":"?s=","defaultLang":"en"},"update":{"title":{"sel":".lastest .lastest-serie","name":".lastest-title a|text","img":".img img|attr-contain:src","url":"a|attr:href","chapter":{"sel":".lastest-chap > a","label":"li|text","url":"|attr:href","at":"li span|text"}}},"title":{"sel":".series + .chapters .chapter-li","name":".series h1.title|text","img":".series .info img|attr-contain:src","tags":"#info > .left > div > p:first-child|row:genre(s)","type":"#info > .left > div > p:first-child|row:type","chapter":{"sel":".chapter-li > a","label":".chapter-info p|text","url":"|attr:href","at":".chapter-info p:nth-child(2)|text"}},"reader":{"sel":"#readerarea","label":"h2.entry-title|text","img":"#readerarea img.ts-main-image[data-index]|[attr:data-src,attr-contain:src]","prev":"a.ch-prev-btn:not(.disabled)|attr:href","next":"a.ch-next-btn:not(.disabled)|attr:href","title":{"sel":".breadcrumb > ul > li:nth-child(3) a","name":"span|text","url":"|attr:href"},"chapter":{"sel":".ctop select#chapter option:not([disabled]):not([value=\"\"])","label":"|text","url":"|attr:value"}},"search":{"title":{"sel":".listupd .lastest-serie","name":".lastest-title|text","url":"a|attr:href","img":"img.ts-post-image|attr-contain:src","chapter":{"sel":".lastest-chap > a","label":"li|text","url":"|attr:href","at":"li span|text"}}}},{"id":"nettruyen","generic":true,"name":"meta[property=\"og:site_name\"]|attr:content","meta":{"updatePath":"","titleBase":"truyen-tranh","titleSlugTransformer":2,"readerBase":"truyen-tranh/{titleSlug}","searchPath":"tim-truyen?keyword=","defaultLang":"vi"},"update":{"title":{"sel":".items > .row > .item","name":"h3 a|text","img":".image img|attr-contain:src","url":"h3 a|attr:href","chapter":{"sel":".chapter","label":"a|text","url":"a|attr:href","at":".time|text"}}},"title":{"sel":"#nt_listchapter nav > ul","name":"#item-detail h1.title-detail|text","img":"#item-detail .detail-info img|attr-contain:src","tags":".kind a[href*=\"/tim-truyen/\"]|text","chapter":{"sel":"#nt_listchapter nav > ul > li.row","label":".chapter a|text","url":".chapter a|attr:href","at":".small|text"}},"reader":{"sel":".reading .reading-detail","label":"a.itemcrumb.active > span[itemprop=\"name\"]|text","img":".reading-detail > .page-chapter > img,.reading-detail > img|attr-contain:src","prev":"a.prev.a_prev:not(.disabled)|attr:href","next":"a.next.a_next:not(.disabled)|attr:href","title":{"sel":"h1.txt-primary a","name":"|text","url":"|attr:href"},"chapter":{"sel":"select.select-chapter option:not([disabled]):not([value=\"\"])","label":"|text","url":"|attr:value"}},"search":{"title":{"sel":".items > .row > .item","name":"h3 a|text","img":".image img|attr-contain:src","url":"h3 a|attr:href"}}},{"id":"manga4life","name":"#Nav .LogoBox a|attr:title","meta":{"updatePath":"","titleBase":"manga","readerBase":"read-online","readerSlugTransformer":1,"searchPath":"search/?name=","defaultLang":"en"},"update":{"title":{"sel":".BoxBody.LatestChapters .row.Chapter","name":".SeriesName > span|text","img":".Image img|attr-contain:src","url":".Image a|attr:href","chapter":{"sel":".Label","label":".ChapterLabel|text","url":"a|attr:href","at":".DateLabel|text"}}},"title":{"sel":".BoxBody div.list-group[ng-if^=\"vm.Chapters\"]","name":".BoxBody h1|text","img":".BoxBody img.img-fluid|attr-contain:src","tags":"a[href*=\"search/?genre=\"]|text","type":"a[href*=\"search/?type=\"]|text","chapter":{"sel":".BoxBody div.list-group[ng-if^=\"vm.Chapters\"] > a.ChapterLink","label":"span:first-child|text","url":"|attr:href","at":"span:last-child|text"}},"reader":{"sel":"#TopPage.ImageGallery","label":"button[data-target=\"#ChapterModal\"]|text","img":".ImageGallery img.img-fluid|attr:ng-src","title":{"sel":".DesktopNav a","name":"|text","url":"|attr:href"}},"search":{"title":{"sel":".SearchFilterNav + .row > div[ng-repeat^=\"Series\"]","name":"div:nth-child(2) a.SeriesName|text","img":"img|attr-contain:src","url":"a|attr:href"}}},{"id":"mangadex","name":"meta[property='og:site_name']|attr:content","meta":{"ajax":true,"updatePath":"titles/latest","titleBase":"title","titleSlugTransformer":1,"constantSlug":true,"readerBase":"chapter","searchPath":"titles?q=","defaultLang":"en","multiLang":true},"fetchOverrides":[{"type":"updates","match":"^api\\.mangadex\\.org\\/(chapter|manga)$","params":[{"key":"limit","value":"96"},{"key":"restrictedContent[]","value":"pornographic"}]},{"type":"chapters","match":"^api\\.mangadex\\.org\\/manga\\/.+\\/feed$","params":[{"id":"limit","key":"limit","value":"500"},{"id":"lang","key":"translatedLanguage[]"}]}]},{"id":"comick","name":"meta[property=\"og:site_name\"],meta[name=\"application-name\"]|attr:content","meta":{"ajax":true,"home":"home","updatePath":"home","titleBase":"comic","readerBase":"comic/{titleSlug}","searchPath":"search?q=tales","defaultLang":"en","multiLang":true},"fetchOverrides":[{"type":"updates","match":"^api\\.comic\\.app\\/chapter$","params":[{"key":"order","value":"hot"},{"key":"accept_erotic_content","value":"true"}]},{"type":"chapters","match":"^api\\.comick\\.app\\/comic\\/.+\\/chapters$","params":[{"id":"limit","key":"limit","value":"1000"},{"id":"lang","key":"lang"}]}],"update":{"title":{"sel":"#updates-container div[title]","name":"|attr:title","img":"img|attr-contain:src","url":"a[href^=\"/comic/\"]|attr:href","chapter":{"sel":"a:last-child","label":"div:first-child|text","url":"|attr:href","at":"div:nth-child(2)|text"}}},"title":{"lazy":true,"sel":"#chapter-header ~ div table > tbody","name":"h1|text","img":"a[href$=\"/covers\"] > img|attr-contain:src","langs":"#chapter-header + div select option:not([value=\"\"]):not([value=\"all\"])|attr:value","tags":"table a.link[href^=\"/search?genres=\"]|text","type":"h1 ~ div.text-sm span:first-child|row:origination","chapter":{"sel":"#chapter-header ~ div table > tbody > tr","label":"td:first-child > a span|text","url":"td:first-child > a|attr:href","at":"td:nth-child(2)|text"}},"reader":{"sel":".images-reader-container","label":"select:first-child option[selected]|text","img":".images-reader-container img|attr-contain:src","title":{"sel":"a + div > a.rounded-full","name":"img[alt]|attr:alt","url":"|attr:href","img":"img|attr-contain:src"},"lang":"select:nth-child(2)|value","prev":".images-reader-container a:first-child[href^=\"/comic/\"]:not(:last-child)|attr:href","next":".images-reader-container a:last-child[href^=\"/comic/\"]|attr:href","chapter":{"sel":"select:first-child option:not([disabled]):not([value=\"\"])","label":"|text","url":"|attr:value"}}}]
|
package/tags.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"id":1,"category":0,"name":"Manga"},{"id":2,"category":0,"name":"Manhua"},{"id":3,"category":0,"name":"Manhwa"},{"id":4,"category":0,"name":"Comic"},{"id":5,"category":0,"name":"Novel"},{"id":6,"category":0,"name":"Anime"},{"id":7,"category":0,"name":"Donghua"},{"id":11,"category":1,"name":"Shounen"},{"id":12,"category":1,"name":"Shoujo"},{"id":13,"category":1,"name":"Seinen"},{"id":14,"category":1,"name":"Josei"},{"id":15,"category":1,"name":"Yaoi"},{"id":16,"category":1,"name":"Yuri"},{"id":20,"category":2,"name":"4 Koma"},{"id":21,"category":2,"name":"Adaptation"},{"id":22,"category":2,"name":"Anthology"},{"id":23,"category":2,"name":"Award Winning"},{"id":24,"category":2,"name":"Doujinshi"},{"id":25,"category":2,"name":"Fan Colored"},{"id":26,"category":2,"name":"Full Color"},{"id":27,"category":2,"name":"Long Strip"},{"id":28,"category":2,"name":"Official Colored"},{"id":29,"category":2,"name":"Oneshot"},{"id":20,"category":2,"name":"Self Published"},{"id":31,"category":2,"name":"Web Comic"},{"id":40,"category":3,"name":"Adult"},{"id":41,"category":3,"name":"Bloody"},{"id":42,"category":3,"name":"Ecchi"},{"id":43,"category":3,"name":"Erotica"},{"id":44,"category":3,"name":"Gore"},{"id":45,"category":3,"name":"Hentai"},{"id":46,"category":3,"name":"Mature"},{"id":47,"category":3,"name":"Smut"},{"id":48,"category":3,"name":"Suggestive"},{"id":49,"category":3,"name":"Violence"},{"id":60,"name":"Action"},{"id":61,"name":"Adventure"},{"id":62,"name":"Age Gap"},{"id":63,"name":"Aliens"},{"id":64,"name":"Animals"},{"id":65,"name":"Beasts"},{"id":66,"name":"Bodyswap"},{"id":67,"name":"Boys' Love","altNames":["shounen ai"]},{"id":68,"name":"Cheating","altNames":["infideli"]},{"id":69,"name":"Childhood Friends"},{"id":70,"name":"Comedy","altNames":["funny"]},{"id":71,"name":"Cooking"},{"id":72,"name":"Crime"},{"id":73,"name":"Cross Dressing"},{"id":74,"name":"Crossdressing"},{"id":75,"name":"Cultivation"},{"id":76,"name":"Delinquents"},{"id":77,"name":"Demons"},{"id":78,"name":"Detective"},{"id":79,"name":"Drama"},{"id":80,"name":"Dungeons"},{"id":81,"name":"Fantasy"},{"id":82,"name":"Fetish"},{"id":83,"name":"Food"},{"id":84,"name":"Game"},{"id":85,"name":"Genderswap"},{"id":86,"name":"Ghosts"},{"id":87,"name":"Girls' Love"},{"id":88,"name":"Gyaru"},{"id":89,"name":"Harem"},{"id":90,"name":"Historical"},{"id":91,"name":"Horror"},{"id":92,"name":"Incest"},{"id":93,"name":"Isekai"},{"id":94,"name":"Loli","altNames":["lolicon"]},{"id":95,"name":"Mafia"},{"id":96,"name":"Magic"},{"id":97,"name":"Magical Girls","altNames":["mahou shoujo"]},{"id":98,"name":"Martial Arts"},{"id":99,"name":"Mecha"},{"id":100,"name":"Medical"},{"id":101,"name":"Military"},{"id":102,"name":"Modern Setting"},{"id":103,"name":"Monster Girls"},{"id":104,"name":"Monsters"},{"id":105,"name":"Murim"},{"id":106,"name":"Music"},{"id":107,"name":"Mystery"},{"id":108,"name":"Ninja"},{"id":109,"name":"Office Workers"},{"id":110,"name":"Overpowered"},{"id":111,"name":"Parody"},{"id":112,"name":"Philosophical"},{"id":113,"name":"Police"},{"id":114,"name":"Post Apocalyptic","altNames":["apocalypse"]},{"id":115,"name":"Psychological"},{"id":116,"name":"Reincarnation","altNames":["regression","rebirth","reincarnate","return","returned","returner"]},{"id":117,"name":"Revenge"},{"id":118,"name":"Reverse Harem"},{"id":119,"name":"Romance"},{"id":120,"name":"Royalty"},{"id":121,"name":"Samurai"},{"id":122,"name":"School Life"},{"id":123,"name":"Sci Fi"},{"id":124,"name":"Science Fiction"},{"id":125,"name":"Shota"},{"id":126,"name":"Slice of Life"},{"id":127,"name":"Sports"},{"id":128,"name":"Superhero"},{"id":129,"name":"Supernatural"},{"id":130,"name":"Survival"},{"id":131,"name":"System","altNames":["cheat system"]},{"id":132,"name":"Thriller"},{"id":133,"name":"Time Travel"},{"id":134,"name":"Traditional Games"},{"id":135,"name":"Tragedy"},{"id":136,"name":"Transmigration"},{"id":137,"name":"Vampires"},{"id":138,"name":"Video Games"},{"id":139,"name":"Villain"},{"id":140,"name":"Villainess"},{"id":141,"name":"Virtual Reality"},{"id":142,"name":"Webtoon"},{"id":143,"name":"Wuxia"},{"id":144,"name":"Yakuzas"},{"id":145,"name":"Zombies"}]
|