diff --git a/.vscode/settings.json b/.vscode/settings.json index 5cf1535..c9c0e4d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,4 +2,5 @@ "adblock.packageManager": "yarn", "adblock.useExternalAglintPackages": true, "adblock.enableAglint": true, + "deno.config": "deno.json", } \ No newline at end of file diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..9d51fbf --- /dev/null +++ b/deno.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "dom.asynciterable", + "deno.ns" + ] + } +} \ No newline at end of file diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..151cf77 --- /dev/null +++ b/deno.lock @@ -0,0 +1,16 @@ +{ + "version": "3", + "remote": { + "https://deno.land/x/denoflate@1.2.1/mod.ts": "f5628e44b80b3d80ed525afa2ba0f12408e3849db817d47a883b801f9ce69dd6", + "https://deno.land/x/denoflate@1.2.1/pkg/denoflate.js": "b9f9ad9457d3f12f28b1fb35c555f57443427f74decb403113d67364e4f2caf4", + "https://deno.land/x/denoflate@1.2.1/pkg/denoflate_bg.wasm.js": "d581956245407a2115a3d7e8d85a9641c032940a8e810acbd59ca86afd34d44d", + "https://deno.land/x/esbuild@v0.20.2/mod.js": "67c608ee283233f5d0faa322b887356857c547a8e6a00981f798b2cd38e02436" + }, + "workspace": { + "packageJson": { + "dependencies": [ + "npm:@adguard/aglint@^2.0.0" + ] + } + } +} diff --git a/userscript build.ts b/userscript build.ts new file mode 100644 index 0000000..76360e9 --- /dev/null +++ b/userscript build.ts @@ -0,0 +1,129 @@ +import * as esbuild from "https://deno.land/x/esbuild@v0.20.2/mod.js"; + +class userjs { + name: string; + namespace: string; + version: string; + description: string; + author: string[]; + source: string; + run_at: string; + grant: string[]; + match: string[]; + constructor( + name: string, + namespace: string, + version: string, + description: string, + author: string[], + source: string, + run_at: + | "document-start" + | "document-body" + | "document-end" + | "document-idle" + | "context-menu" = "document-end", + grant: string[] = [], + match: string[], + ) { + this.name = name; + this.namespace = namespace; + this.version = version; + this.description = description; + this.author = author; + this.source = source; + this.run_at = run_at; + this.grant = grant; + this.match = match; + } + toString(): string { + const b = ["// ==UserScript=="]; + b.push(`// @name ${this.name}`); + b.push(`// @version ${this.version}`); + b.push(`// @source ${this.source}`); + b.push(`// @description ${this.description}`); + for (const author of this.author) { + b.push(`// @author ${author}`); + } + b.push(`// @run-at ${this.run_at}`); + if (this.grant.length == 0) { + b.push(`// @grant none`); + }else { + for (const grant of this.grant) + b.push(`// @grant ${grant}`); + } + for (const match of this.match) { + b.push(`// @match ${match}`); + } + b.push("// ==/UserScript=="); + return b.join("\n"); + } +} + +async function userscript_build(prefix: string, metadata: userjs) { + console.log(`Building ${prefix}`); + await esbuild.build({ + outfile: `userscripts/${prefix}.user.js`, + bundle: true, + charset: "utf8", + banner: { + "js": metadata.toString(), + }, + entryPoints: [`userscripts/${prefix}.ts`], + minify: true, + platform: "browser", + target: "es2022", + }); +} + +await userscript_build( + "girlgenius", + new userjs( + "Girlgenius https fix", + "https://sebastian-tobie.de/", + "0.2", + "converts http to https urls", + ["Sebastian Tobie"], + "https://gitea.sebastian-tobie.de/sebastian/cookiedb/raw/branch/stable/userscripts/girlgenius.user.js", + "document-body", + [], + [], + ), +); +await userscript_build( + "kobo_easy_archive", + new userjs( + "Kobo library easy archive", + "https://sebastian-tobie.de/", + "0.1", + "Helps with archiving kobo books", + ["Sebastian Tobie"], + "https://gitea.sebastian-tobie.de/sebastian/cookiedb/raw/branch/stable/userscripts/kobo_easy_archive.user.js", + "document-idle", + [], + [ + "https://www.kobo.com/de/de/library/books", + "https://www.kobo.com/de/de/library/books?*", + ], + ), +); +await userscript_build( + "thalia-filter", + new userjs( + "Thalia Filter", + "https://sebastian-tobie.de/", + "0.2", + "Filters out unwanted books", + ["Sebastian Tobie"], + "https://gitea.sebastian-tobie.de/sebastian/cookiedb/raw/branch/stable/userscripts/girlgenius.user.js", + "document-end", + ["GM_registerMenuCommand"], + [ + "https://www.thalia.de/kategorie/*", + "https://www.thalia.de/kategorie/*/", + "https://www.thalia.de/kategorie/*?*", + "https://www.thalia.de/ebook/kategorien/*/neuheiten", + ], + ), +); +Deno.exit(); diff --git a/userscripts/girlgenius.js b/userscripts/girlgenius.js deleted file mode 100644 index e8870b0..0000000 --- a/userscripts/girlgenius.js +++ /dev/null @@ -1,50 +0,0 @@ -// ==UserScript== -// @name Girlgenius https fix -// @namespace https://sebastian-tobie.de/ -// @version 0.1 -// @description converts http to https urls -// @author Sebastian Tobie -// @source https://gitea.sebastian-tobie.de/sebastian/cookiedb/raw/branch/stable/userscripts/girlgenius.js -// @run-at document-body -// @match https://www.girlgeniusonline.com/* -// @grant none -// @unwrap -// ==/UserScript== -function replacehttp(url) { - let u = new URL(url); - console.debug(u.protocol, "http:" == u.protocol) - if(u.protocol == "http:") { - let old = url.href; - u.protocol = "https:"; - console.debug("fixed url",old,u.href); - } - return u.toString(); -} - -(function() { - 'use strict'; - console.debug("http replacer loaded"); - let elements = document.getElementsByTagName("a"); - console.info("found", elements.length, "links"); - for (let i = 0 ; i{function c(o){let e=new URL(o);if(console.debug(e.protocol,e.protocol=="http:"),e.protocol=="http:"){let l=e.href;e.protocol="https:",console.debug("fixed url",l,e.href)}return e.toString()}console.debug("http replacer loaded");var n=document.getElementsByTagName("a");console.info("found",n.length,"links");for(let o=0;o{var d=document.getElementsByClassName("headers-end")[0],n=document.createElement("span");n.classList.add("heading");n.classList.add("more-actions");d.appendChild(n);var l=document.getElementsByClassName("library-items")[0];for(let e=0;e = document.getElementsByClassName( + "tm-produktliste__eintrag artikel", + ); + const not_found: string[] = []; + let removed = 0; + for (const book of books) { + if (book === null) continue; + if (book.style.display == "none") { + continue; + } + if (trie.startsWith(titel(book))) { + book.style.display = "none"; + removed += 1; + } else not_found.push(titel(book)); + } + const artikel = document.getElementsByClassName("sichtbare-artikel"); + if (artikel.length != 0) { + artikel[0].innerHTML = not_found.length.toString(); + } + console.debug(artikel); + console.debug("titel nicht in der blacklist:", not_found); +} + +async function run() { + GM_registerMenuCommand("Clean results", function (event: Event) { + console.debug(event); + event.preventDefault(); + clean(); + }, "c"); + const button = document.getElementsByTagName("suche-button-mehr-laden"); + if (button.length != 0) { + for (let i = 0; i < 10; i++) await button[0].load(); + } + clean(); +} +run(); diff --git a/userscripts/thalia-filter.user.js b/userscripts/thalia-filter.user.js index 644227b..ca5f065 100644 --- a/userscripts/thalia-filter.user.js +++ b/userscripts/thalia-filter.user.js @@ -1,299 +1,14 @@ // ==UserScript== -// @name Thalia Filter -// @namespace https://sebastian-tobie.de/ -// @version 0.1 -// @match https://www.thalia.de/kategorie/* -// @match https://www.thalia.de/kategorie/*/ -// @match https://www.thalia.de/kategorie/*?* -// @match https://www.thalia.de/ebook/kategorien/*/neuheiten -// @icon https://www.google.com/s2/favicons?sz=64&domain=thalia.de +// @name Thalia Filter +// @version 0.2 +// @source https://gitea.sebastian-tobie.de/sebastian/cookiedb/raw/branch/stable/userscripts/girlgenius.user.js +// @description Filters out unwanted books +// @author Sebastian Tobie // @run-at document-end -// @grant GM_registerMenuCommand +// @grant GM_registerMenuCommand +// @match https://www.thalia.de/kategorie/* +// @match https://www.thalia.de/kategorie/*/ +// @match https://www.thalia.de/kategorie/*?* +// @match https://www.thalia.de/ebook/kategorien/*/neuheiten // ==/UserScript== - -var prefixes = [ - "#drcl", - "10 erste male", - "A Couple of Cuckoos", - "Aristia", - "Asterix", - "Café Liebe", - "Charon", - "Cheering up in the underworld", - "Colette beschließt zu sterben", - "D.N. Angel", - "Definitely Love", - "Der Sommer", - "Die mit dem Teufel tanzt", - "Ein Zeichen der Zuneigung", - "Elainas Reise", - "Galerie einer neuen Galaxis", - "Gespielte Liebe", - "Go! Go! Loser Ranger", - "Hallo, ich bin eine Hexe und mein Schwarm wünscht sich einen Liebestrank von mir", - "Himmelblaue Zeiten", - "How to train a newbie", - "Ich habe 300 Jahre lang", - "Ich täuschte Amnesie vor, um meinen Verlobten loszuwerden", - "Kleiner Tai & Omi Sue", - "Kreative Kurzaufgaben", - "Lone Wolf & Cub Master", - "Manga! Manga!", - "Merit und der ägyptische", - "Murciélago", - "Peter Grill", - "Real Account", - "Red Apple", - "Ripper", - "Solo Leveling Roman Taschenbuchausgabe", - "Star Wars", - "Tokyo Aliens", - "Touring after the apocalypse", - "Wiedergeburt in Maydare", - "Yuzu", - "ab sofort schwester!", - "adou", - "after school", - "alice in borderland", - "alice und die halbbluthexe", - "all you want, whenever you want", - "and then i know love", - "and then i love you", - "angels of death", - "anyway, i love you", - "arifureta - der kampf zurück in meine welt", - "assassin's creed", - "auf und ab", - "bakemonogatari", - "barakamon", - "beast after school", - "birds of shangri-la", - "bitter playmate", - "black butler", - "bloody bites at boarding school", - "blue eye lie", - "boruto", - "canis", - "crossing borders", - "dahlia lässt den kopf nicht hängen", - "das band der unterwelt", - "das kind, das ich in meinen träumen sah", - "das magische baumhaus", - "das opfer des", - "dead mount death play", - "deadlock", - "der dieb und das biest", - "der fuchs und der kleine tanuki", - "der geschmack nach melone", - "der stärkste held mit dem mal der schwäche", - "die for me, my darling", - "die hexe und das biest", - "die hexe und ihr drache", - "die hohe", - "die nacht hinter dem dreiecksfenster", - "die rachsüchtige", - "die schokohexe ", - "die walkinder", - "don't lie to me", - "dr. stone", - "drachenregen", - "edens zero", - "ein bund fürs leben", - "ein landei aus dem dorf vor dem letzten dungeon sucht das abenteuer in der stadt", - "elden ring kapitel", - "elden ring", - "eliana", - "enceladus - die graphic novel", - "fairy tale", - "fangirl", - "final fantasy", - "fire force", - "flüster mir ein liebeslied", - "folge den wolken nach nord-nordwest", - "from bottom to lover", - "gachiakuta", - "gannibal", - "gestatten, ich bin's", - "goblin slayer!", - "harahara sensei", - "hiraeth", - "human extinction", - "hunter x hunter", - "i hear the sunspot", - "i'll be here for you", - "im schatten der fabriken", - "in/spectre", - "insomniacs", - "interviews mit Monster-mädchen", - "is love the answer?", - "isekai office worker", - "jagaaan", - "jealousy blinds love", - "just mary", - "kabukicho bad trip", - "kijin gentosho", - "konosuba", - "küsse", - "lass meine hand nicht los", - "lieb mich noch, bevor du stirbst", - "liebe ist (k)ein wettkampf", - "lightning and romance", - "lonely castle in the mirror", - "love escape", - "lullaby of the dawn", - "madk", - "manga love story", - "meet me online", - "megumi & tsugumi", - "mein isekai-leben", - "mein nachbar", - "mein untergang", - "meine arbeit als missionar in einer gottlosen welt", - "meine wiedergeburt als schleim in einer anderen welt", - "midnight scandal sex", - "minato's coin laundry", - "mord im dekagon", - "moriarty the patriot", - "mpd psycho", - "mr nobody", - "mushoku tensei", - "my dear curse-casting vampiress", - "my genderless boyfriend", - "my hero academia", - "my love will last till the end of time", - "my senpai is annoying", - "my younger senpai", - "nana & kaoru: das letzte jahr", - "never love an egoist", - "nina - die sterne sind dein schicksal", - "one piece", - "one room dog", - "overlord", - "penelope", - "planetes perfect edition", - "planetes perfect", - "pluto: urasawa x tezuka", - "prince never give up", - "prinz freya", - "radiant", - "raeliana", - "re:zero", - "relife", - "religiöse helden", - "rental girlfriend", - "requiem of the rose king", - "rosen blood", - "saint seiya", - "saraba, yoki hi", - "saturn return", - "schattenprinzessin des drachenkönigs", - "servamp, band", - "seven deadly sins", - "severed", - "shaman king", - "shojo nach der schule", - "silent witch", - "skip & loafer", - "skip beat", - "sleeping dead", - "smoking behind the supermarket", - "stigmata", - "sugar apple fairy tale", - "suzume", - "sword art online", - "takopi und die sache mit dem glück", - "teach me how to kill you", - "the beast must die", - "the beginning after the end", - "the dungeon of black company", - "the elusive samurai", - "the gender of mona lisa", - "the guy she was interested in wasn't a guy at all", - "the heroic legend of arslan", - "the ichinose family's deadly sins", - "the male bride", - "the man who shattered my world", - "the most distant love", - "the reprise", - "the saint's magic power is omnipotent", - "threesome", - "to the abandoned sacred beasts", - "tokyo revengers", - "tokyopop", - "too close to love", - "touching your night", - "twin star", - "undead unluck", - "under ninja", - "unlimited lust", - "vampire knight", - "veil", - "verbotene allianz", - "verliebt in mehr als dein gesicht", - "victoria's electric coffin", - "vinland saga", - "virgin road", - "white light ceremony", - "wind breaker", - "wise man", - "wistoria", - "wolverine", - "yakuza angel", - "yona", - "you're my cutie!", - "your sweet scent", - "yuzu - die kleine tierärztin", - "zombie hide sex", -]; - -for (let i in prefixes) { - prefixes[i] = prefixes[i].toLowerCase(); -} -function titel(/** @type {Element} */book) { - return book.getElementsByClassName("element-text-standard-black tm-artikeldetails__titel")[0].innerHTML.toLowerCase() -} - -function blacklisted(/** @type {Element} */book) { - let titl = titel(book); - for (let i in prefixes) { - if (titl.startsWith(prefixes[i])) { - return true - }; - } - return false -} - -function clean() { - let books = document.getElementsByClassName("tm-produktliste__eintrag artikel"); - /** @type {string[]} */ - let not_found = []; - let removed = 0 - for (let i = 0; i < books.length; i++) { - let book = books.item(i); - if (book === null) { continue}; - if (book.style.display == "none") { - continue - } - if (blacklisted(book)) { - book.style.display = "none"; - removed += 1; - } else { not_found.push(titel(book)) } - }; - let artikel = document.getElementsByClassName("sichtbare-artikel"); - if (artikel.length != 0) { - artikel[0].innerHTML = not_found.length; - } - console.debug(artikel) - console.debug("titel nicht in der blacklist:", not_found); -} - -(async function () { - 'use strict'; - GM_registerMenuCommand("Clean results", function (event) { console.debug(event); event.preventDefault(); clean() }, "c"); - let button = document.getElementsByTagName("suche-button-mehr-laden"); - if (button.length != 0) { - for (let i = 0; i < 10; i++) { await button[0].load(); } - } - clean(); - console.debug(prefixes); -})(); \ No newline at end of file +(()=>{var r=class{children;isEndOfWord;constructor(){this.children=new Map,this.isEndOfWord=!1}},s=class{root;constructor(e=[]){this.root=new r;for(let n of e)this.insert(n)}insert(e){let n=this.root;for(let i of e)n.children.has(i)||n.children.set(i,new r),n=n.children.get(i);n.isEndOfWord=!0}startsWith(e){let n=this.root;for(let i of e){if(!n.children.has(i))return!1;if(n=n.children.get(i),n.isEndOfWord)return!0}return!0}},o=new s(["#drcl","10 erste male","A Couple of Cuckoos","Aristia","Asterix","Café Liebe","Charon","Cheering up in the underworld","Colette beschließt zu sterben","D.N. Angel","Definitely Love","Der Sommer","Die mit dem Teufel tanzt","Ein Zeichen der Zuneigung","Elainas Reise","Galerie einer neuen Galaxis","Gespielte Liebe","Go! Go! Loser Ranger","Hallo, ich bin eine Hexe und mein Schwarm wünscht sich einen Liebestrank von mir","Himmelblaue Zeiten","How to train a newbie","Ich habe 300 Jahre lang","Ich täuschte Amnesie vor, um meinen Verlobten loszuwerden","Kleiner Tai & Omi Sue","Kreative Kurzaufgaben","Lone Wolf & Cub Master","Manga! Manga!","Merit und der ägyptische","Murciélago","Peter Grill","Real Account","Red Apple","Ripper","Solo Leveling Roman Taschenbuchausgabe","Star Wars","Tokyo Aliens","Touring after the apocalypse","Wiedergeburt in Maydare","Yuzu","ab sofort schwester!","adou","after school","alice in borderland","alice und die halbbluthexe","all you want, whenever you want","and then i know love","and then i love you","angels of death","anyway, i love you","arifureta - der kampf zurück in meine welt","assassin's creed","auf und ab","bakemonogatari","barakamon","beast after school","birds of shangri-la","bitter playmate","black butler","bloody bites at boarding school","blue eye lie","boruto","canis","crossing borders","dahlia lässt den kopf nicht hängen","das band der unterwelt","das kind, das ich in meinen träumen sah","das magische baumhaus","das opfer des","dead mount death play","deadlock","der dieb und das biest","der fuchs und der kleine tanuki","der geschmack nach melone","der stärkste held mit dem mal der schwäche","die for me, my darling","die hexe und das biest","die hexe und ihr drache","die hohe","die nacht hinter dem dreiecksfenster","die rachsüchtige","die schokohexe ","die walkinder","don't lie to me","dr. stone","drachenregen","edens zero","ein bund fürs leben","ein landei aus dem dorf vor dem letzten dungeon sucht das abenteuer in der stadt","elden ring kapitel","elden ring","eliana","enceladus - die graphic novel","fairy tale","fangirl","final fantasy","fire force","flüster mir ein liebeslied","folge den wolken nach nord-nordwest","from bottom to lover","gachiakuta","gannibal","gestatten, ich bin's","goblin slayer!","harahara sensei","hiraeth","human extinction","hunter x hunter","i hear the sunspot","i'll be here for you","im schatten der fabriken","in/spectre","insomniacs","interviews mit Monster-mädchen","is love the answer?","isekai office worker","jagaaan","jealousy blinds love","just mary","kabukicho bad trip","kijin gentosho","konosuba","küsse","lass meine hand nicht los","lieb mich noch, bevor du stirbst","liebe ist (k)ein wettkampf","lightning and romance","lonely castle in the mirror","love escape","lullaby of the dawn","madk","manga love story","meet me online","megumi & tsugumi","mein isekai-leben","mein nachbar","mein untergang","meine arbeit als missionar in einer gottlosen welt","meine wiedergeburt als schleim in einer anderen welt","midnight scandal sex","minato's coin laundry","mord im dekagon","moriarty the patriot","mpd psycho","mr nobody","mushoku tensei","my dear curse-casting vampiress","my genderless boyfriend","my hero academia","my love will last till the end of time","my senpai is annoying","my younger senpai","nana & kaoru: das letzte jahr","never love an egoist","nina - die sterne sind dein schicksal","one piece","one room dog","overlord","penelope","planetes perfect edition","planetes perfect","pluto: urasawa x tezuka","prince never give up","prinz freya","radiant","raeliana","re:zero","relife","religiöse helden","rental girlfriend","requiem of the rose king","rosen blood","saint seiya","saraba, yoki hi","saturn return","schattenprinzessin des drachenkönigs","servamp, band","seven deadly sins","severed","shaman king","shojo nach der schule","silent witch","skip & loafer","skip beat","sleeping dead","smoking behind the supermarket","stigmata","sugar apple fairy tale","suzume","sword art online","takopi und die sache mit dem glück","teach me how to kill you","the beast must die","the beginning after the end","the dungeon of black company","the elusive samurai","the gender of mona lisa","the guy she was interested in wasn't a guy at all","the heroic legend of arslan","the ichinose family's deadly sins","the male bride","the man who shattered my world","the most distant love","the reprise","the saint's magic power is omnipotent","threesome","to the abandoned sacred beasts","tokyo revengers","tokyopop","too close to love","touching your night","twin star","undead unluck","under ninja","unlimited lust","vampire knight","veil","verbotene allianz","verliebt in mehr als dein gesicht","victoria's electric coffin","vinland saga","virgin road","white light ceremony","wind breaker","wise man","wistoria","wolverine","yakuza angel","yona","you're my cutie!","your sweet scent","yuzu - die kleine tierärztin","zombie hide sex"]);function l(t){return t.getElementsByClassName("element-text-standard-black tm-artikeldetails__titel")[0].innerHTML.toLowerCase()}function d(){let t=document.getElementsByClassName("tm-produktliste__eintrag artikel"),e=[],n=0;for(let a of t)a!==null&&a.style.display!="none"&&(o.startsWith(l(a))?(a.style.display="none",n+=1):e.push(l(a)));let i=document.getElementsByClassName("sichtbare-artikel");i.length!=0&&(i[0].innerHTML=e.length.toString()),console.debug(i),console.debug("titel nicht in der blacklist:",e)}async function h(){GM_registerMenuCommand("Clean results",function(e){console.debug(e),e.preventDefault(),d()},"c");let t=document.getElementsByTagName("suche-button-mehr-laden");if(t.length!=0)for(let e=0;e<10;e++)await t[0].load();d()}h();})(); diff --git a/userscripts/thalia_lib.ts b/userscripts/thalia_lib.ts new file mode 100644 index 0000000..fe0149b --- /dev/null +++ b/userscripts/thalia_lib.ts @@ -0,0 +1,278 @@ +class TrieNode { + children: Map; + isEndOfWord: boolean; + constructor() { + this.children = new Map(); + this.isEndOfWord = false; + } +} + +class Trie { + root: TrieNode; + constructor(inputs: string[] = []) { + this.root = new TrieNode(); + for (const item of inputs) { + this.insert(item.toLowerCase()); + } + } + + insert(word: string) { + let node = this.root; + for (const char of word) { + if (!node.children.has(char)) { + node.children.set(char, new TrieNode()); + } + node = node.children.get(char)!; + } + node.isEndOfWord = true; + } + + startsWith(word: string) { + let node = this.root; + for (const char of word) { + if (!node.children.has(char)) { + return false; + } + node = node.children.get(char)!; + if (node.isEndOfWord) { + return true; + } + } + return true; + } +} +const trie = new Trie([ + "#drcl", + "10 erste male", + "A Couple of Cuckoos", + "Aristia", + "Asterix", + "Café Liebe", + "Charon", + "Cheering up in the underworld", + "Colette beschließt zu sterben", + "D.N. Angel", + "Definitely Love", + "Der Sommer", + "Die mit dem Teufel tanzt", + "Ein Zeichen der Zuneigung", + "Elainas Reise", + "Galerie einer neuen Galaxis", + "Gespielte Liebe", + "Go! Go! Loser Ranger", + "Hallo, ich bin eine Hexe und mein Schwarm wünscht sich einen Liebestrank von mir", + "Himmelblaue Zeiten", + "How to train a newbie", + "Ich habe 300 Jahre lang", + "Ich täuschte Amnesie vor, um meinen Verlobten loszuwerden", + "Kleiner Tai & Omi Sue", + "Kreative Kurzaufgaben", + "Lone Wolf & Cub Master", + "Manga! Manga!", + "Merit und der ägyptische", + "Murciélago", + "Peter Grill", + "Real Account", + "Red Apple", + "Ripper", + "Solo Leveling Roman Taschenbuchausgabe", + "Star Wars", + "Tokyo Aliens", + "Touring after the apocalypse", + "Wiedergeburt in Maydare", + "Yuzu", + "ab sofort schwester!", + "adou", + "after school", + "alice in borderland", + "alice und die halbbluthexe", + "all you want, whenever you want", + "and then i know love", + "and then i love you", + "angels of death", + "anyway, i love you", + "arifureta - der kampf zurück in meine welt", + "assassin's creed", + "auf und ab", + "bakemonogatari", + "barakamon", + "beast after school", + "birds of shangri-la", + "bitter playmate", + "black butler", + "bloody bites at boarding school", + "blue eye lie", + "boruto", + "canis", + "crossing borders", + "dahlia lässt den kopf nicht hängen", + "das band der unterwelt", + "das kind, das ich in meinen träumen sah", + "das magische baumhaus", + "das opfer des", + "dead mount death play", + "deadlock", + "der dieb und das biest", + "der fuchs und der kleine tanuki", + "der geschmack nach melone", + "der stärkste held mit dem mal der schwäche", + "die for me, my darling", + "die hexe und das biest", + "die hexe und ihr drache", + "die hohe", + "die nacht hinter dem dreiecksfenster", + "die rachsüchtige", + "die schokohexe ", + "die walkinder", + "don't lie to me", + "dr. stone", + "drachenregen", + "edens zero", + "ein bund fürs leben", + "ein landei aus dem dorf vor dem letzten dungeon sucht das abenteuer in der stadt", + "elden ring kapitel", + "elden ring", + "eliana", + "enceladus - die graphic novel", + "fairy tale", + "fangirl", + "final fantasy", + "fire force", + "flüster mir ein liebeslied", + "folge den wolken nach nord-nordwest", + "from bottom to lover", + "gachiakuta", + "gannibal", + "gestatten, ich bin's", + "goblin slayer!", + "harahara sensei", + "hiraeth", + "human extinction", + "hunter x hunter", + "i hear the sunspot", + "i'll be here for you", + "im schatten der fabriken", + "in/spectre", + "insomniacs", + "interviews mit Monster-mädchen", + "is love the answer?", + "isekai office worker", + "jagaaan", + "jealousy blinds love", + "just mary", + "kabukicho bad trip", + "kijin gentosho", + "konosuba", + "küsse", + "lass meine hand nicht los", + "lieb mich noch, bevor du stirbst", + "liebe ist (k)ein wettkampf", + "lightning and romance", + "lonely castle in the mirror", + "love escape", + "lullaby of the dawn", + "madk", + "manga love story", + "meet me online", + "megumi & tsugumi", + "mein isekai-leben", + "mein nachbar", + "mein untergang", + "meine arbeit als missionar in einer gottlosen welt", + "meine wiedergeburt als schleim in einer anderen welt", + "midnight scandal sex", + "minato's coin laundry", + "mord im dekagon", + "moriarty the patriot", + "mpd psycho", + "mr nobody", + "mushoku tensei", + "my dear curse-casting vampiress", + "my genderless boyfriend", + "my hero academia", + "my love will last till the end of time", + "my senpai is annoying", + "my younger senpai", + "nana & kaoru: das letzte jahr", + "never love an egoist", + "nina - die sterne sind dein schicksal", + "one piece", + "one room dog", + "overlord", + "penelope", + "planetes perfect edition", + "planetes perfect", + "pluto: urasawa x tezuka", + "prince never give up", + "prinz freya", + "radiant", + "raeliana", + "re:zero", + "relife", + "religiöse helden", + "rental girlfriend", + "requiem of the rose king", + "rosen blood", + "saint seiya", + "saraba, yoki hi", + "saturn return", + "schattenprinzessin des drachenkönigs", + "servamp, band", + "seven deadly sins", + "severed", + "shaman king", + "shojo nach der schule", + "silent witch", + "skip & loafer", + "skip beat", + "sleeping dead", + "smoking behind the supermarket", + "stigmata", + "sugar apple fairy tale", + "suzume", + "sword art online", + "takopi und die sache mit dem glück", + "teach me how to kill you", + "the beast must die", + "the beginning after the end", + "the dungeon of black company", + "the elusive samurai", + "the gender of mona lisa", + "the guy she was interested in wasn't a guy at all", + "the heroic legend of arslan", + "the ichinose family's deadly sins", + "the male bride", + "the man who shattered my world", + "the most distant love", + "the reprise", + "the saint's magic power is omnipotent", + "threesome", + "to the abandoned sacred beasts", + "tokyo revengers", + "tokyopop", + "too close to love", + "touching your night", + "twin star", + "undead unluck", + "under ninja", + "unlimited lust", + "vampire knight", + "veil", + "verbotene allianz", + "verliebt in mehr als dein gesicht", + "victoria's electric coffin", + "vinland saga", + "virgin road", + "white light ceremony", + "wind breaker", + "wise man", + "wistoria", + "wolverine", + "yakuza angel", + "yona", + "you're my cutie!", + "your sweet scent", + "yuzu - die kleine tierärztin", + "zombie hide sex", +]); +export { trie };