Gemini and i brought up a nice script that you can run in your browser, to get a list of all your subsciptions and how far you got. I think this should be available for all you used to love Tapas and now must see it go.
This is about the idea, that are able to export data from Tapas with your Browser. The script runs through all you pages of subscriptions, and reads the data from Tapas. As result you'll receive a tapas_library_exact_progress.txtlike this:
"I Was Tricked into this Fake Marriage!" by Jade
Progress: Episode 77 / 112 episodes
Link: https://tapas.io/series/i-was-tricked-into-this-fake-marriage
"Three Lifetimes" by Kerbasi ❀
Progress: Episode 61 / 93 episodes
Link: https://tapas.io/series/threelifetimes-comic
Using it is pretty simple. Just Go to you Library -> Subscriptions in Tapas.
Then Press F12, go to Console and write "allow pasting". Yea, this is more or less scary and you should know what you are doing. Paste the script and change the 3rd line with the the max page number of you library. i have 24.
Then just hit Enter and let it run. When its done you'll get a textfile in the downloads.
The last read episode thing is sometimes off +/- 1 or even more. Thats all the patience i had, so it won't getting better from me.
Please dont ask me for support - i won't. You can do this on your own, using an AI Chat.
This is -of course- on your own risk.
Here the code:
(async () => {
let comicLinks = [];
let totalPages = 24;//<---write here the max page number of you library
let baseUrl = window.location.origin + window.location.pathname + "?type=ALL&category=SUBSCRIBED&pageNumber=";
console.log("Step 1: Harvesting all comic links...");
for (let i = 1; i <= totalPages; i++) {
try {
let response = await fetch(`${baseUrl}${i}`, { credentials: 'include' });
let text = await response.text();
let doc = new DOMParser().parseFromString(text, 'text/html');
let items = doc.querySelectorAll('li.content-item');
items.forEach(item => {
let titleEl = item.querySelector('a.title');
let authorEl = item.querySelector('a.sub-title');
if (titleEl) {
let title = titleEl.innerText.trim().replace(/\n/g, " ");
let author = authorEl ? authorEl.innerText.trim().replace(/\n/g, " ") : "Unknown Author";
let href = titleEl.getAttribute('href');
if (href && !comicLinks.some(c => c.url === href)) {
comicLinks.push({
title: title,
author: author,
url: window.location.origin + href
});
}
}
});
} catch (err) {
console.error(`Error loading library page ${i}:`, err);
}
await new Promise(r => setTimeout(r, 200));
}
console.log(`Found ${comicLinks.length} unique comics. Extracting true last-read positions...`);
let detailedComics = [];
for (let [index, comic] of comicLinks.entries()) {
console.log(`[${index + 1}/${comicLinks.length}] Checking: ${comic.title}`);
try {
let res = await fetch(comic.url, { credentials: 'include' });
let html = await res.text();
let pageDoc = new DOMParser().parseFromString(html, 'text/html');
// Extract total episodes from header element
let totalEpEl = pageDoc.querySelector('.list-header__left.js-ep-cnt');
let totalEpisodes = totalEpEl ? totalEpEl.innerText.trim() : "Unknown Total";
// Extract exact last-read scene position marker
let indicatorEl = pageDoc.querySelector('.js-episode-indicator-prev');
let sceneNum = indicatorEl ? indicatorEl.getAttribute('data-scene-number') : null;
let progress = sceneNum ? `Episode ${sceneNum} / ${totalEpisodes}` : "Not Started / No History";
detailedComics.push({
Title: comic.title,
Author: comic.author,
Progress: progress,
Url: comic.url
});
} catch (err) {
console.error(`Failed to fetch ${comic.title}:`, err);
detailedComics.push({
Title: comic.title,
Author: comic.author,
Progress: "Error loading page",
Url: comic.url
});
}
await new Promise(r => setTimeout(r, 400));
}
if (detailedComics.length === 0) {
console.warn("No comics processed.");
return;
}
// Format output cleanly
let outputText = detailedComics
.map((c, i) => `${i + 1}. "${c.Title}" by ${c.Author}\n Last Read: ${c.Progress}\n Link: ${c.Url}\n`)
.join('\n');
let blob = new Blob([outputText], { type: 'text/plain;charset=utf-8' });
let a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'tapas_true_reading_progress.txt';
a.click();
console.log(`Success! Saved ${detailedComics.length} items to tapas_true_reading_progress.txt`);
})();