This PowerShell script repository for backing up your data is about to be deprecated in favor of a newly rewritten Python executable module that you can install directly with PIP and that is much easier to update.
At the time of this writing, the project is under development and does not have a production release date. Have a look at the
bokusu
repo to see the progress.Once the module is completed, this repository will be archived, won't get updated and supported, and will have a deprecation note in your script's log. We will provide instructions for migrating in this repo and as well in
bokusu
. However, looking at the massive infrastructure gaps, only some of secrets and configurations were copied.
Automatically (and also manually) backup your anime and manga libraries from several anime, manga, TV shows, movies, and books tracking sites. Made possible with PowerShell Core.
Warning
This project requires PowerShell Core 7 or higher.
Please download the latest version from here, or write this command for Windows 10 and higher on command prompt or Windows PowerShell:
winget install --id Microsoft.PowerShell -e
- About
- Supported Sites
- Files Generated and Importability
- Features
- Getting Started
- Variable Keys
- Configurations
- Usage
"Anime Manga Auto Backup" is my personal take to automate process in back-up your anime and manga libraries, automatically using worker like GitHub Actions or execute manually from your machine, from MyAnimeList.net, Kitsu, AniList, Annict, Baka-Updates Manga, Shikimori, Anime-Planet, Notify.moe, SIMKL, and Trakt. I use PowerShell Core to write the script because it is cross-platform and easy to use.
This project requires you to set the library/list as public as most API used in this projects are from 3rd party and User Agent string may required to be filled in environment variable for the backup progress works.
Note
For better readability, any sites that is does not have specific requirements
are marked with -
(dash).
Warning
I am not responsible and liable for warranty for any damage caused by using this project.
Site Name | Country of Origin | Languages | Media Type to Backup | FOSS* | Supported | Method | Public? | UA*? | PAT*? | Notes |
---|---|---|---|---|---|---|---|---|---|---|
AniList | United Kingdom | English | Anime, Manga | - | âś… | API |
- | - | - | |
Anime-Planet | United States | English | Anime, Manga | - | âś… | 3PA |
Yes | Yes | - | Uses MAL Exporter from Azure Website |
Annict | Japan | Japanese, English | Anime | Yes | âś… | API |
- | - | Yes | User can generate Personal Access Token from account |
Baka-Updates | United States†| English | Manga | - | ✅ | API |
- | - | - | Logging in with API, but CSV/TSV export is undocumented API path |
Bangumi | China | Chinese | Anime, Manga, Games, TV Show | Yes | âś… | API |
- | - | Yes | |
Kaize.io | Switzerland†| English | Anime, Manga | - | ✅ | SCRAPE |
Yes | - | - | Scrapes user's profile page and lists |
Kitsu | United States | Multiple languages | Anime, Manga | Yes | âś… | API |
- | - | - | |
MangaDex | Vietnam†| English | Manga | - | ✅ | API |
- | - | - | Will be deprecated soon, 2FA-enabled account and OAuth not supported |
MyAnimeList | United States, Japan | English | Anime, Manga | - | âś… | 3PA |
Yes | Yes | - | Uses MAL Exporter from Azure Website |
Notify.moe | Korea, Japan | English | Anime | Yes | âś… | API |
Yes | - | - | |
Otak Otaku | Indonesia | Indonesian, Japanese | Anime | - | âś… | API |
Yes | Yes | - | Uses official undocumented API endpoint |
Shikimori | Russia | Russian, English | Anime, Manga | Yes | âś… | COOKIE |
- | Yes | - | Uses _kawai_session cookie saved on browser |
SIMKL | United States | English | TV Show, Movie, Anime | - | âś… | API |
- | - | - | |
Trakt | United States | English | TV Show, Movie | - | âś… | API |
- | - | - | Uses traktexport Python package/module |
VNDB | The Netherlands†| English | Visual Novel (Game) | Yes | ✅ | API , SCRAPE |
- | Yes | Yes | Uses vndb_auth cookie saved on browser for XML,JSON uses official API via Token |
9Anime | United States†| English | Anime | - | 🚫 | COOKIE |
- | Yes | - | Unable to bypass security measures put by dev |
AniDB | Germany†| English | Anime | Yes | 💻 | API |
- | - | - | Currently looking on how to fetch user's MyList safely |
aniSearch | Germany | German, English, Spanish, French, Italian, Japanese | Anime, Manga, Live Action | - | đź”” | SCRAPE |
- | - | - | Scrapes user's profile page and lists |
Goodreads | United States | English | Book | - | đź”” | SCRAPE |
- | - | - | |
IMDb | United States | English | Movie, TV Show | - | đź”” | SCRAPE |
- | - | - | |
LiveChart.me | United States†| English | Anime | - | 🚫 | API |
- | - | - | Cannot bypass Cloudflare "DDoS protection"/"I'm under attack" mode, whatever method is |
MyDramaList | United States†| English | Drama | - | 🔔 | SCRAPE |
- | - | - | |
Nautiljon | France | French | Anime, Manga, Drama | - | đźš« | SCRAPE |
- | - | - | Cannot bypass Cloudflare "DDoS protection"/"I'm under attack" mode |
The Movie Database | United States | English | Movie, TV Show | - | đź”” | API |
- | - | - |
All column header with ?
in the end means that the site may or may not require
it.
- †: Based on IP or ICANN Domain Lookup; as the site did not write contact address on their terms of services and privacy policy, or does not have both.
- * FOSS: Free and Open Source Software
- * UA: User Agent
- * PAT: Personal Access Token
Method
Legends:API
: Uses official API from the site; Python/PowerShell module also fall in this category if it uses official endpoint3PA
: Uses 3rd party API from other site.COOKIE
: Uses official (undocumented) API from the site, and cookie may required to be used as authentication (not to be confused withPAT
)SCRAPE
: Scrapes user's lists directly from HTML if the site does not have API endpoint, uses Python.
Supported
Legends:- âś… : Available
- đźš« : Not Available
- đź”” : Planned
- ⌛ : In Development
- đź’» : Technical difficulty, usually due to pagination or need to scrape XML/HTML table and does not have capability to do so.
Note
For better readability, any sites that is does not have capability are marked
with -
(dash).
Site Name | File Saved As | MALXML Support | Can Be Imported Back? | Description |
---|---|---|---|---|
AniList | .json , .xml |
Yes | Yes | You need to use Automail to import back to AniList in JSON. XML can be used for AniList, MyAnimeList, or other |
Anime-Planet | .xml |
Yes | Limited | Backup file is formatted as MyAnimeList XML, some entry might not restored if MAL did not list it |
Annict | .json |
- | - | - |
Baka-Updates | .tsv |
- | - | - |
Bangumi | .json |
- | - | - |
Kaize | .json , .xml |
Yes | Yes | .xml export only available for anime list, .json is not importable |
Kitsu | .xml , .json |
Yes | Yes | Only .xml can be imported back to MyAnimeList or other |
MangaDex | .json , .yaml , .xml |
Yes | - | Only .xml can be imported back to MyAnimeList or other |
MyAnimeList | .xml |
Yes | Yes | You can reimport back to MyAnimeList |
Notify.moe | .json , .csv , .txt , .xml |
Yes | Limited | Only .xml can be imported back to MyAnimeList or other. Reimporting requires MAL, Kitsu, or AL account |
Otak Otaku | .json , .xml |
Yes | Yes | To reimport back to Otak Otaku, archive manually .xml as .gz , plain .xml only can be imported to MyAnimeList or other |
Shikimori | .json , .xml |
Yes | Yes | You can reimport back to Shikimori using both formats or import to MyAnimeList and other sites using XML |
SIMKL | .json , .zip , .csv , .xml |
Yes | Yes | Use https://simkl.com/apps/import/json/ and upload ZIP file to import back. .csv can be imported on other sites |
Trakt | .json |
- | - | - |
VNDB | .json , .xml |
- | - | Export as .json only for manual/local backup, GitHub Actions can not invoke the request due to unknown error |
- MALXML in this table refers to a XML format used by MyAnimeList, and is
used by some sites to import/export data.
- Please to check import feature availability on each site. We can not guarantee if the site supports MALXML format by default.
- Cross-compatible for Windows, Linux, and macOS
- Backup anime/manga list from supported sites
- Backup anime/manga list as MAL XML format, if supported
- Built-in Environment file generator if
.env
file is not found - Automatically backup by schedule (only for automated method: GitHub Actions)
- Automatically update the script weekly (only for automated method: GitHub Actions)
- Configurable backup and update schedule (only for automated method: GitHub Actions)
- Save snapshots (profile, lists, statistics) of supported sites using Wayback Machine.
- Global statistic for all sites you have backup
Important
This method is very slow and might take hours to finish. Use with care. Recommended to run this only on your local machine.
This repo supports snapshotting your profile, lists, and even statistics of your media progress in supported sites using Internet Archive's Wayback Machine, thanks to waybackpy.
By enabling the snapshot support by changing value WAYBACK_ENABLE
to True
means your profile from all snapshot-supported sites must be visible to public.
Site Name | Supported? | Notes | Coverage |
---|---|---|---|
AniList | - | Page was returned blank | - |
Anime-Planet | Yes | - | Profile, anime, manga |
Annict | Yes | - | Profile, anime |
Bangumi | Yes | - | Profile, anime, manga, game, drama |
Kaize | Yes | - | Profile, anime, manga, stats, KP, badges |
Kitsu | Yes | - | Profile, anime, manga |
MangaDex | - | User profile is private | - |
MangaUpdates | Yes | - | Profile |
MyAnimeList | Yes | - | Profile, anime, manga. history |
Notify.moe | Yes | - | Profile, anime |
Otak Otaku | Yes | - | Profile |
Shikimori | Yes | - | Profile, anime, manga, achievements |
SIMKL | Yes | - | Profile, anime, TV, movies, stats |
Trakt | Yes | - | Profile, stats, history, progress, collection, watchlist |
VNDB | Yes | - | Profile, games, wishlist |
You also can contribute to Internet Archive's Wayback Machine to snapshot
homepage of supported sites on this repo by modifying WAYBACK_SNAPMAINSITE
variable on .env
file to True
.
These instructions will get you a copy of the project up and running on your local machine or using GitHub Actions.
Before starting the script, you need to install the following packages:
curl
as fallback for several sites that requires cookies. Native method usingInvoke-WebRequest
sometime failed to append cookies on requests.git
- PowerShell Core (
pwsh
) version >= 7.0.0 python
version >= 3.7
You also need to fork the repository before cloning the repo to your local machine.
-
Follow instructions on # For GitHub Actions to set the secrets.
[!WARNING]
Do not ever modify
.env.example
if you did not want your password, username, secrets, etc revealed by public. -
Follow instruction on # On GitHub Actions to initialize/run GitHub Actions.
-
Start
./script.ps1
as the script will run generator automatically if.env
file can not be found. -
Or, run the generator directly from working directory:
./Modules/Environment-Generator.ps1
- Duplicate the
.env.example
file and rename to.env
file. - Follow the instructions in # Variable Keys to set the variables.
- If you did not registered to some site, leave the value empty.
Note
We recommend you to follow # Automated guide to ease the process. Then you can simply copy keys and values to your repo Settings > Secrets > Actions.
Following steps will assume you know what you're doing and still prefer manual.
- Open repo settings.
- On the left sidebar, find "Secrets" and click Actions.
- Click New repository secret button.
- Follow the instructions in # Variables Keys to set the
variables.
- The text on
code block
in the instruction mean a name, and Value is the key/cookie. - Repeat this step for all the variables listed in the instruction.
- If you did not registered to some site, leave the value empty.
- The text on
Website: https://anilist.co
Variable Name | Description | Value Type | Example |
---|---|---|---|
ANILIST_USERNAME |
AniList username | String | nattadasu |
ANILIST_CLIENT_ID |
AniList Client ID for API access. You can generate one from your account via Developer Settings |
Integer | 1234 |
ANILIST_CLIENT_SECRET |
AniList Client Secret for API access. You can generate one from your account via Developer Settings |
String, 40 characters case sensitive | AB12cd34EF56gh78IJ90kl12MN34op56QR78st90 |
ANILIST_REDIRECT_URI |
AniList Redirect URI for API access. Must be https://anilist.co/api/v2/oauth/pin |
String, URI | https://anilist.co/api/v2/oauth/pin |
ANILIST_ACCESS_TOKEN |
AniList Access Token to your account. Must be generated by ./Modules/Get-AniListAuth.ps1 |
String, JWT format | eyJ0... |
ANILIST_OAUTH_REFRESH |
AniList account refresh token Must be generated by ./Modules/Get-AniListAuth.ps1 |
String | def... |
ANILIST_OAUTH_EXPIRES |
AniList account refresh token expiration time Must be generated by ./Modules/Get-AniListAuth.ps1 |
Integer, Epoch/Unix timestamp | 1234567890 |
-
To get
ANILIST_ACCESS_TOKEN
,ANILIST_OAUTH_REFRESH
andANILIST_OAUTH_EXPIRES
, you need to generate them first.To generate them, please fill your
ANILIST_CLIENT_ID
,ANILIST_CLIENT_SECRET
andANILIST_REDIRECT_URI
in your ENV file and init/run./Modules/Get-AniListAuth.ps1
, then follow the instructions.
Website: https://anime-planet.com
Important
This method requires # User Agent configured properly
Variable Name | Description | Value Type | Example |
---|---|---|---|
ANIMEPLANET_USERNAME |
Anime-Planet username | String | nattadasu |
Website: https://annict.com | https://en.annict.com | https://annict.jp
Variable Name | Description | Value Type | Example |
---|---|---|---|
ANNICT_PERSONAL_ACCESS_TOKEN |
Annict Personal Access Token Get the token via Application Settings |
String | f0O84r_Ba37h15I50u111yT3xt... |
Website: https://mangaupdates.com
Important
This method requires # User Agent configured properly
Variable Name | Description | Value Type | Example |
---|---|---|---|
MANGAUPDATES_USERNAME |
Baka-Updates username | String | nattadasu |
MANGAUPDATES_PASSWORD |
Baka-Updates password | String | 5up3rS3Cure_-_P@sSwOrd |
Website: https://bgm.tv
Variable Name | Description | Value Type | Example |
---|---|---|---|
BANGUMI_PERSONAL_ACCESS_TOKEN |
Bangumi Personal Access Token Token must be valid for 1 year (365天) maximum. Generate by Token Generator and click “查看所有令牌” |
String | f0O84rBa37h15I50u111yT3xt... |
BANGUMI_PAT_EXPIRY |
Bangumi Personal Access Token expiry date in yyyy-MM-dd format |
String | 2021-12-31 |
BANGUMI_USERNAME |
Bangumi username | String | nattadasu |
Website: https://kaize.io
Variable Name | Description | Value Type | Example |
---|---|---|---|
KAIZE_USERNAME |
Kaize.io username | String | nattadasu |
-
Username can be obtained from the URL of your profile page.
Example:
https://kaize.io/user/username ^^^^^^^^
Website: https://kitsu.app
Variable Name | Description | Value Type | Example |
---|---|---|---|
KITSU_EMAIL |
Kitsu email | String | hello@nattadasu.my.id |
KITSU_PASSWORD |
Kitsu password | String | 5up3rS3Cure_-_P@sSwOrd |
Website: https://mangadex.org
Warning
This method (login via raw password) would be deprecated in future! There is no ETA to implement OAuth2 using OpenID. See more regarding to the issue at MangaDex Announcement Discord Server (#api-changelog).
Important
2FA-enabled account is not supported!
Variable Name | Description | Value Type | Example |
---|---|---|---|
MANGADEX_USERNAME |
MangaDex username | String | nattadasu |
MANGADEX_PASSWORD |
MangaDex password | String | 5up3rS3Cure_-_P@sSwOrd |
Website: https://myanimelist.net
Important
This method requires # User Agent configured properly
Variable Name | Description | Value Type | Example |
---|---|---|---|
MAL_USERNAME |
MyAnimeList username | String | nattadasu |
Website: https://notify.moe
Variable Name | Description | Value Type | Example |
---|---|---|---|
NOTIFYMOE_NICKNAME |
Notify nickname/username, must be upper-first case | String, Upper-first case | Nattadasu |
Website: https://otakotaku.com
Important
This method requires # User Agent configured properly
Variable Name | Description | Value Type | Example |
---|---|---|---|
OTAKOTAKU_USERNAME |
Otak Otaku username | String | nattadasu |
Website: https://simkl.com
Variable Name | Description | Value Type | Example |
---|---|---|---|
SIMKL_CLIENT_ID |
SIMKL Client ID, get it from SIMKL Developer Settings, with redirection URI urn:ietf:wg:oauth:2.0:oob |
String, 64 characters | AB12cd34EF56gh78IJ90kl12MN34op56QR78st90UV12wx34YZ56ab78cd90ef12 |
SIMKL_ACCESS_TOKEN |
SIMKL access token, SIMKL_CLIENT_ID must be filled, and run ./Get-SimklAuth.ps1 to generate |
String, 64 characters | AB12cd34EF56gh78IJ90kl12MN34op56QR78st90UV12wx34YZ56ab78cd90ef12 |
Website: https://shikimori.one
Important
This method requires # User Agent configured properly
Variable Name | Description | Value Type | Example |
---|---|---|---|
SHIKIMORI_USERNAME |
Shikimori username | String | nattadasu |
SHIKIMORI_KAWAI_SESSION |
Shikimori session cookie under _kawaii_session name |
String, URL encoded | ABCD%3F51gsj021%20... |
Website: https://trakt.tv
Variable Name | Description | Value Type | Example |
---|---|---|---|
TRAKT_USERNAME |
Trakt username | String | nattadasu |
TRAKT_CLIENT_ID |
Trakt Client ID To generate, go to Trakt and click "Create New Application". Set urn:ietf:wg:oauth:2.0:oob as Redirect URIs |
String, 64 characters | AB12cd34EF56gh78IJ90kl12MN34op56QR78st90UV12wx34YZ56ab78cd90ef12 |
TRAKT_CLIENT_SECRET |
Trakt Client Secret | String, 64 characters | AB12cd34EF56gh78IJ90kl12MN34op56QR78st90UV12wx34YZ56ab78cd90ef12 |
TRAKT_OAUTH_EXPIRY |
Trakt OAuth expiry generated by traktexport Python module |
Integer, Epoch/Unix timestamp | 1234567890 |
TRAKT_OAUTH_REFRESH |
Trakt OAuth refresh token generated by traktexport Python module |
String, 64 characters | AB12cd34EF56gh78IJ90kl12MN34op56QR78st90UV12wx34YZ56ab78cd90ef12 |
TRAKT_OAUTH_TOKEN |
Trakt OAuth token generated by traktexport Python module |
String, 64 characters | AB12cd34EF56gh78IJ90kl12MN34op56QR78st90UV12wx34YZ56ab78cd90ef12 |
-
To get
TRAKT_OAUTH_EXPIRY
,TRAKT_OAUTH_REFRESH
,TRAKT_OAUTH_TOKEN
, runtraktexport auth <username>
with<username>
is your Trakt username, if not installed, runpip install traktexport
from terminal.Follow instructions from the module, pasting in your Client ID/Secret from the Trakt dashboard, going to the link and pasting the generated pin back into the terminal.
After init done, run
type .traktexport\traktexport.json
in%USERPROFILE%
/~
directory on Windows orcat ~/.local/share/traktexport.json
on POSIX system (Linux/macOS) to copy the credential.
Website: https://vndb.org
Important
This method requires # User Agent configured properly
Important
VNDB_TOKEN
/JSON backup is only work for manual/local backup, not for
automatic backup via GitHub Actions due to unknown error.
Variable Name | Description | Value Type | Example |
---|---|---|---|
VNDB_UID |
VNDB user ID | Integer | u1234 |
VNDB_AUTH |
VNDB session cookie, used to export XML | String, 40 characters + UID | AB12cd34EF56gh78IJ90kl12MN34op56QR78st90.u1234 |
VNDB_TOKEN |
VNDB token for JSON export, only work for manual/local backup | String, 38 characters | abcd-3f9h1-jk1mn-0p9-r5tuv-wxyza-8cd3 |
-
To get
VNDB_UID
, click on any links that stated with "My" or your username, and copy the fragment of your URL that is started with letter "u" and ID number after it.For example:
https://vndb.org/u123456/ulist?vnlist=1 ^^^^^^^
-
To get
VNDB_AUTH
, tap F12 or "Inspect Page" when right-clicking the site, open "Storage" tab, and click "Cookies" of the site.Find a name of the cookie that starts with
vndb_auth
and copy the value. -
To grab
VNDB_TOKEN
, Go to your profile, click onEdit
tab, and click onApplication
tab.Click on
New token
button, set application name, check Access to my list (including private items), and clickSubmit
button below.Copy the token from textbox and paste it below.
The token should be 38 characters long.
The script allows user modify additional configurations. The configurations
saved in .env
file for local, and GitHub's Repository Secrets for automated
process using GitHub Actions.
Below are the keys of allowed configurations
Variable Name | Description | Required for | Value Type | Example |
---|---|---|---|---|
USER_AGENT |
Your user agent. You can get your current browser user agent from WhatIsMyBrowser.com |
Anime-Planet, MangaUpdates, MyAnimeList, Otak Otaku, Shikimori, VNDB, WAYBACK_ENABLE , WAYBACK_SNAPMAINSITE |
String | ... |
Variable Name | Description | Required for | Value Type | Default | Example |
---|---|---|---|---|---|
MINIFY_JSON |
Minify all JSON, not intended for use on manual inspection or Git diff |
- | Boolean (True , False ) |
False |
False |
REPO_PAT |
GitHub Personal Access Token to update repo automatically via GitHub Actions | Automated: GitHub Actions | String | - | ghp_... |
-
REPO_PAT
is your GitHub Personal Access Token to update repo from Settings / Developer Settings / Personal Access Tokens. Enableworkflow
option and set expiration date more than a month.However, you are not needed to add
REPO_PAT
in your Environment File if you run the script locally.
Variable Name | Description | Required for | Value Type | Default | Example |
---|---|---|---|---|---|
BACKUP_FREQ |
Tell GitHub Actions to do backup at the time scheduled | Automated: GitHub Actions | String, CRON | 0 0 * * SUN |
0 0 * * SUN |
UPDATE_FREQ |
Tell GitHub Actions to check and update scripts and several components | Automated: GitHub Actions | String, CRON | 0 0 * * * |
0 0 * * * |
Variable Name | Description | Required for | Value Type | Default | Example |
---|---|---|---|---|---|
WAYBACK_ENABLE |
Enable Wayback Machine feature to snapshot the site you're backing up. USER_AGENT required |
- | Boolean (True , False ) |
False |
False |
WAYBACK_SNAPMAINSITE |
Contribute Wayback Machine by snapshot the homepage of repo's supported sites. USER_AGENT required |
- | Boolean (True , False ) |
False |
False |
- Open Command Prompt/Terminal, type
pwsh
. - Change directory to the directory where you cloned the project.
- Type
./script.ps1
, and let the script run by itself.
- Open Actions tab.
- Opt in the feature to enable.
- Done.
- Done. Basically, the Action is enabled by default.
Note
The script will automatically run at 0:00 AM UTC every Sunday, or you can trigger manually from dispatch.
You can change this behavior by modifying BACKUP_FREQ
in environment.