From 185c353e6678db7bde9732cd2b0ae26e95c2b0b6 Mon Sep 17 00:00:00 2001 From: mkelvers Date: Sat, 11 Apr 2026 22:32:58 +0200 Subject: [PATCH] tool: add watch-order dataset builder --- cmd/watchorder/main.go | 243 +++++++++++++++++++++++++++++++++++++++++ data/watch_order.json | 1 + 2 files changed, 244 insertions(+) create mode 100644 cmd/watchorder/main.go create mode 100644 data/watch_order.json diff --git a/cmd/watchorder/main.go b/cmd/watchorder/main.go new file mode 100644 index 0000000..e266c60 --- /dev/null +++ b/cmd/watchorder/main.go @@ -0,0 +1,243 @@ +package main + +import ( + "context" + "encoding/json" + "flag" + "fmt" + "net/http" + "os" + "path/filepath" + "regexp" + "sort" + "strconv" + "strings" + "time" + + "github.com/PuerkitoBio/goquery" + + "mal/internal/watchorder" +) + +const defaultUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36" + +var idPattern = regexp.MustCompile(`/id/(\d+)`) + +type seedPayload struct { + IDs []int `json:"ids"` +} + +type outputPayload struct { + Data map[string][]watchorder.WatchOrderEntry `json:"data"` +} + +func parseRootID(url string) (int, error) { + match := idPattern.FindStringSubmatch(url) + if len(match) != 2 { + return 0, fmt.Errorf("invalid watch-order url: %s", url) + } + + id, err := strconv.Atoi(match[1]) + if err != nil { + return 0, fmt.Errorf("invalid watch-order id in url %s: %w", url, err) + } + + return id, nil +} + +func fetchDocument(ctx context.Context, client *http.Client, url string) (*goquery.Document, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, err + } + + req.Header.Set("User-Agent", defaultUserAgent) + req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8") + req.Header.Set("Accept-Language", "en-US,en;q=0.9") + req.Header.Set("Referer", "https://chiaki.site/") + req.Header.Set("Cache-Control", "no-cache") + + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("status %d", resp.StatusCode) + } + + return goquery.NewDocumentFromReader(resp.Body) +} + +func parseRows(doc *goquery.Document) []watchorder.WatchOrderEntry { + entries := make([]watchorder.WatchOrderEntry, 0) + + doc.Find("tr[data-id]").Each(func(_ int, selection *goquery.Selection) { + rawID, ok := selection.Attr("data-id") + if !ok { + return + } + + id, err := strconv.Atoi(strings.TrimSpace(rawID)) + if err != nil { + return + } + + typeLabel := "" + rawTypeID, hasType := selection.Attr("data-type") + if hasType { + typeID := strings.TrimSpace(rawTypeID) + typeLabel = mapTypeByID(doc, typeID) + } + + title := strings.TrimSpace(selection.Find(".wo_title").First().Text()) + titleAlt := strings.TrimSpace(selection.Find(".uk-text-small").First().Text()) + + entries = append(entries, watchorder.WatchOrderEntry{ + ID: id, + Type: typeLabel, + Title: title, + TitleAlt: titleAlt, + }) + }) + + return entries +} + +func mapTypeByID(doc *goquery.Document, typeID string) string { + label := "" + doc.Find("#wo_type_filter label").EachWithBreak(func(_ int, selection *goquery.Selection) bool { + input := selection.Find("input[type='checkbox']") + value, ok := input.Attr("value") + if ok && strings.TrimSpace(value) == typeID { + label = strings.TrimSpace(selection.Text()) + return false + } + return true + }) + + return label +} + +func parseIDList(value string) ([]int, error) { + if strings.TrimSpace(value) == "" { + return []int{}, nil + } + + parts := strings.Split(value, ",") + ids := make([]int, 0, len(parts)) + for _, part := range parts { + trimmed := strings.TrimSpace(part) + if trimmed == "" { + continue + } + + id, err := strconv.Atoi(trimmed) + if err != nil { + return nil, fmt.Errorf("invalid id %q: %w", trimmed, err) + } + ids = append(ids, id) + } + + return ids, nil +} + +func loadSeedIDs(path string) ([]int, error) { + if strings.TrimSpace(path) == "" { + return []int{}, nil + } + + content, err := os.ReadFile(path) + if err != nil { + return nil, err + } + + payload := seedPayload{} + if err := json.Unmarshal(content, &payload); err != nil { + return nil, err + } + + return payload.IDs, nil +} + +func sortAndUnique(ids []int) []int { + seen := make(map[int]bool) + unique := make([]int, 0, len(ids)) + for _, id := range ids { + if id <= 0 || seen[id] { + continue + } + seen[id] = true + unique = append(unique, id) + } + + sort.Ints(unique) + return unique +} + +func main() { + outputPath := flag.String("out", "data/watch_order.json", "output json file path") + seedPath := flag.String("seed", "tmp/watch_order_seed_ids.json", "seed json file path with {\"ids\": [...]} ") + idList := flag.String("ids", "", "comma-separated MAL ids") + flag.Parse() + + idsFromFlag, err := parseIDList(*idList) + if err != nil { + fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } + + idsFromSeed, err := loadSeedIDs(*seedPath) + if err != nil { + fmt.Fprintf(os.Stderr, "error: failed to load seed ids: %v\n", err) + os.Exit(1) + } + + allIDs := sortAndUnique(append(idsFromSeed, idsFromFlag...)) + if len(allIDs) == 0 { + fmt.Fprintln(os.Stderr, "error: no ids provided (use -seed and/or -ids)") + os.Exit(1) + } + + httpClient := &http.Client{Timeout: 12 * time.Second} + ctx := context.Background() + + data := make(map[string][]watchorder.WatchOrderEntry, len(allIDs)) + for _, id := range allIDs { + url := fmt.Sprintf("https://chiaki.site/?/tools/watch_order/id/%d", id) + if _, err := parseRootID(url); err != nil { + continue + } + + doc, err := fetchDocument(ctx, httpClient, url) + if err != nil { + continue + } + + if doc.Find("#wo_list").Length() == 0 { + continue + } + + data[strconv.Itoa(id)] = parseRows(doc) + } + + encoded, err := json.Marshal(outputPayload{Data: data}) + if err != nil { + fmt.Fprintf(os.Stderr, "error: failed to encode output: %v\n", err) + os.Exit(1) + } + + outputDirectory := filepath.Dir(*outputPath) + if err := os.MkdirAll(outputDirectory, 0o755); err != nil { + fmt.Fprintf(os.Stderr, "error: failed to create data directory: %v\n", err) + os.Exit(1) + } + + if err := os.WriteFile(*outputPath, encoded, 0o644); err != nil { + fmt.Fprintf(os.Stderr, "error: failed to write output %q: %v\n", *outputPath, err) + os.Exit(1) + } + + fmt.Printf("wrote watch-order dataset for %d ids to %s\n", len(data), *outputPath) +} diff --git a/data/watch_order.json b/data/watch_order.json new file mode 100644 index 0000000..171b747 --- /dev/null +++ b/data/watch_order.json @@ -0,0 +1 @@ +{"data":{"34572":[{"id":33950,"type":"OVA","title":"Black Clover: Jump Festa 2016 Special"},{"id":34572,"type":"TV","title":"Black Clover"},{"id":39864,"type":"Special","title":"Petit Clover Advance"},{"id":38768,"type":"Special","title":"Black Clover: Jump Festa 2018 Special","title_alt":"Black Clover: The All Magic Knights Thanksgiving Festa"},{"id":40031,"type":"ONA","title":"Mugyutto! Black Clover","title_alt":"Squishy! Black Clover"},{"id":48585,"type":"Movie","title":"Black Clover: Mahou Tei no Ken","title_alt":"Black Clover: Sword of the Wizard King"},{"id":61967,"type":"TV","title":"Black Clover 2nd Season","title_alt":"Black Clover Season 2"}],"37430":[{"id":37430,"type":"TV","title":"Tensei shitara Slime Datta Ken","title_alt":"That Time I Got Reincarnated as a Slime"},{"id":39607,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Veldora Nikki","title_alt":"That Time I Got Reincarnated as a Slime: Tales - Veldora's Journal"},{"id":38793,"type":"OVA","title":"Tensei shitara Slime Datta Ken OVA","title_alt":"That Time I Got Reincarnated as a Slime OAD"},{"id":45753,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Hinata Sakaguchi","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Digression - Hinata Sakaguchi"},{"id":39551,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 2"},{"id":41488,"type":"TV","title":"Tensura Nikki: Tensei shitara Slime Datta Ken","title_alt":"The Slime Diaries"},{"id":49318,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 2nd Season: Kanwa - Veldora Nikki 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Tales - Veldora's Journal 2"},{"id":41487,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2 Part 2"},{"id":51309,"type":"ONA","title":"Sukuwareru Ramiris"},{"id":54050,"type":"CM","title":"He Wei Dao x Guan Yu Wo Zhuan Sheng Bian Cheng Shi Lai Mu Zhe Dang Shi"},{"id":49877,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen","title_alt":"That Time I Got Reincarnated as a Slime: The Movie - Scarlet Bond"},{"id":55720,"type":"ONA","title":"Genjitsu no Rimuru: Sunshine in the Slime"},{"id":57434,"type":"Special","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen Specials"},{"id":54565,"type":"ONA","title":"Tensei shitara Slime Datta Ken: Coleus no Yume","title_alt":"That Time I Got Reincarnated as a Slime: Visions of Coleus"},{"id":58592,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 3rd Season: Kanwa - Diablo Nikki","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Diablo's Journal"},{"id":53580,"type":"TV","title":"Tensei shitara Slime Datta Ken 3rd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 3"},{"id":59493,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Luminous Memories","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Luminous Memories"},{"id":59971,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie 2: Soukai no Namida-hen","title_alt":"That Time I Got Reincarnated as a Slime the Movie: Tears of the Azure Sea"},{"id":59970,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season","title_alt":"That Time I Got Reincarnated as a Slime Season 4"},{"id":63129,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 4 Part 2"}],"39551":[{"id":37430,"type":"TV","title":"Tensei shitara Slime Datta Ken","title_alt":"That Time I Got Reincarnated as a Slime"},{"id":39607,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Veldora Nikki","title_alt":"That Time I Got Reincarnated as a Slime: Tales - Veldora's Journal"},{"id":38793,"type":"OVA","title":"Tensei shitara Slime Datta Ken OVA","title_alt":"That Time I Got Reincarnated as a Slime OAD"},{"id":45753,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Hinata Sakaguchi","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Digression - Hinata Sakaguchi"},{"id":39551,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 2"},{"id":41488,"type":"TV","title":"Tensura Nikki: Tensei shitara Slime Datta Ken","title_alt":"The Slime Diaries"},{"id":49318,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 2nd Season: Kanwa - Veldora Nikki 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Tales - Veldora's Journal 2"},{"id":41487,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2 Part 2"},{"id":51309,"type":"ONA","title":"Sukuwareru Ramiris"},{"id":54050,"type":"CM","title":"He Wei Dao x Guan Yu Wo Zhuan Sheng Bian Cheng Shi Lai Mu Zhe Dang Shi"},{"id":49877,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen","title_alt":"That Time I Got Reincarnated as a Slime: The Movie - Scarlet Bond"},{"id":55720,"type":"ONA","title":"Genjitsu no Rimuru: Sunshine in the Slime"},{"id":57434,"type":"Special","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen Specials"},{"id":54565,"type":"ONA","title":"Tensei shitara Slime Datta Ken: Coleus no Yume","title_alt":"That Time I Got Reincarnated as a Slime: Visions of Coleus"},{"id":58592,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 3rd Season: Kanwa - Diablo Nikki","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Diablo's Journal"},{"id":53580,"type":"TV","title":"Tensei shitara Slime Datta Ken 3rd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 3"},{"id":59493,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Luminous Memories","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Luminous Memories"},{"id":59971,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie 2: Soukai no Namida-hen","title_alt":"That Time I Got Reincarnated as a Slime the Movie: Tears of the Azure Sea"},{"id":59970,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season","title_alt":"That Time I Got Reincarnated as a Slime Season 4"},{"id":63129,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 4 Part 2"}],"40748":[{"id":38777,"type":"PV","title":"Jujutsu Kaisen Official PVs"},{"id":40748,"type":"TV","title":"Jujutsu Kaisen"},{"id":52558,"type":"Music","title":"Vivid Vice"},{"id":48561,"type":"Movie","title":"Jujutsu Kaisen 0 Movie","title_alt":"Jujutsu Kaisen 0"},{"id":51009,"type":"TV","title":"Jujutsu Kaisen 2nd Season","title_alt":"Jujutsu Kaisen Season 2"},{"id":56243,"type":"TV Special","title":"Jujutsu Kaisen 2nd Season Recaps","title_alt":"Jujutsu Kaisen Season 2 Recaps"},{"id":59654,"type":"Movie","title":"Jujutsu Kaisen: Kaigyoku/Gyokusetsu","title_alt":"Jujutsu Kaisen: Hidden Inventory/Premature Death"},{"id":62392,"type":"Movie","title":"Jujutsu Kaisen Movie: Shibuya Jihen Tokubetsu Henshuu-ban x Shimetsu Kaiyuu Senkou Jouei","title_alt":"Jujutsu Kaisen: Execution"},{"id":57658,"type":"TV","title":"Jujutsu Kaisen: Shimetsu Kaiyuu - Zenpen","title_alt":"Jujutsu Kaisen: The Culling Game Part 1"}],"41487":[{"id":37430,"type":"TV","title":"Tensei shitara Slime Datta Ken","title_alt":"That Time I Got Reincarnated as a Slime"},{"id":39607,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Veldora Nikki","title_alt":"That Time I Got Reincarnated as a Slime: Tales - Veldora's Journal"},{"id":38793,"type":"OVA","title":"Tensei shitara Slime Datta Ken OVA","title_alt":"That Time I Got Reincarnated as a Slime OAD"},{"id":45753,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Hinata Sakaguchi","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Digression - Hinata Sakaguchi"},{"id":39551,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 2"},{"id":41488,"type":"TV","title":"Tensura Nikki: Tensei shitara Slime Datta Ken","title_alt":"The Slime Diaries"},{"id":49318,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 2nd Season: Kanwa - Veldora Nikki 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Tales - Veldora's Journal 2"},{"id":41487,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2 Part 2"},{"id":51309,"type":"ONA","title":"Sukuwareru Ramiris"},{"id":54050,"type":"CM","title":"He Wei Dao x Guan Yu Wo Zhuan Sheng Bian Cheng Shi Lai Mu Zhe Dang Shi"},{"id":49877,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen","title_alt":"That Time I Got Reincarnated as a Slime: The Movie - Scarlet Bond"},{"id":55720,"type":"ONA","title":"Genjitsu no Rimuru: Sunshine in the Slime"},{"id":57434,"type":"Special","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen Specials"},{"id":54565,"type":"ONA","title":"Tensei shitara Slime Datta Ken: Coleus no Yume","title_alt":"That Time I Got Reincarnated as a Slime: Visions of Coleus"},{"id":58592,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 3rd Season: Kanwa - Diablo Nikki","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Diablo's Journal"},{"id":53580,"type":"TV","title":"Tensei shitara Slime Datta Ken 3rd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 3"},{"id":59493,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Luminous Memories","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Luminous Memories"},{"id":59971,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie 2: Soukai no Namida-hen","title_alt":"That Time I Got Reincarnated as a Slime the Movie: Tears of the Azure Sea"},{"id":59970,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season","title_alt":"That Time I Got Reincarnated as a Slime Season 4"},{"id":63129,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 4 Part 2"}],"53580":[{"id":37430,"type":"TV","title":"Tensei shitara Slime Datta Ken","title_alt":"That Time I Got Reincarnated as a Slime"},{"id":39607,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Veldora Nikki","title_alt":"That Time I Got Reincarnated as a Slime: Tales - Veldora's Journal"},{"id":38793,"type":"OVA","title":"Tensei shitara Slime Datta Ken OVA","title_alt":"That Time I Got Reincarnated as a Slime OAD"},{"id":45753,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Hinata Sakaguchi","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Digression - Hinata Sakaguchi"},{"id":39551,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 2"},{"id":41488,"type":"TV","title":"Tensura Nikki: Tensei shitara Slime Datta Ken","title_alt":"The Slime Diaries"},{"id":49318,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 2nd Season: Kanwa - Veldora Nikki 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Tales - Veldora's Journal 2"},{"id":41487,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2 Part 2"},{"id":51309,"type":"ONA","title":"Sukuwareru Ramiris"},{"id":54050,"type":"CM","title":"He Wei Dao x Guan Yu Wo Zhuan Sheng Bian Cheng Shi Lai Mu Zhe Dang Shi"},{"id":49877,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen","title_alt":"That Time I Got Reincarnated as a Slime: The Movie - Scarlet Bond"},{"id":55720,"type":"ONA","title":"Genjitsu no Rimuru: Sunshine in the Slime"},{"id":57434,"type":"Special","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen Specials"},{"id":54565,"type":"ONA","title":"Tensei shitara Slime Datta Ken: Coleus no Yume","title_alt":"That Time I Got Reincarnated as a Slime: Visions of Coleus"},{"id":58592,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 3rd Season: Kanwa - Diablo Nikki","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Diablo's Journal"},{"id":53580,"type":"TV","title":"Tensei shitara Slime Datta Ken 3rd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 3"},{"id":59493,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Luminous Memories","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Luminous Memories"},{"id":59971,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie 2: Soukai no Namida-hen","title_alt":"That Time I Got Reincarnated as a Slime the Movie: Tears of the Azure Sea"},{"id":59970,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season","title_alt":"That Time I Got Reincarnated as a Slime Season 4"},{"id":63129,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 4 Part 2"}],"56876":[{"id":50739,"type":"TV","title":"Otonari no Tenshi-sama ni Itsunomanika Dame Ningen ni Sareteita Ken","title_alt":"The Angel Next Door Spoils Me Rotten"},{"id":56876,"type":"TV","title":"Otonari no Tenshi-sama ni Itsunomanika Dame Ningen ni Sareteita Ken 2","title_alt":"The Angel Next Door Spoils Me Rotten Season 2"}],"59708":[{"id":30813,"type":"PV","title":"Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e PV"},{"id":35507,"type":"TV","title":"Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e","title_alt":"Classroom of the Elite"},{"id":51096,"type":"TV","title":"Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e 2nd Season","title_alt":"Classroom of the Elite II"},{"id":51180,"type":"TV","title":"Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e 3rd Season","title_alt":"Classroom of the Elite III"},{"id":59708,"type":"TV","title":"Youkoso Jitsuryoku Shijou Shugi no Kyoushitsu e 4th Season: 2-nensei-hen 1 Gakki","title_alt":"Classroom of the Elite IV"}],"59970":[{"id":37430,"type":"TV","title":"Tensei shitara Slime Datta Ken","title_alt":"That Time I Got Reincarnated as a Slime"},{"id":39607,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Veldora Nikki","title_alt":"That Time I Got Reincarnated as a Slime: Tales - Veldora's Journal"},{"id":38793,"type":"OVA","title":"Tensei shitara Slime Datta Ken OVA","title_alt":"That Time I Got Reincarnated as a Slime OAD"},{"id":45753,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Hinata Sakaguchi","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Digression - Hinata Sakaguchi"},{"id":39551,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 2"},{"id":41488,"type":"TV","title":"Tensura Nikki: Tensei shitara Slime Datta Ken","title_alt":"The Slime Diaries"},{"id":49318,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 2nd Season: Kanwa - Veldora Nikki 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Tales - Veldora's Journal 2"},{"id":41487,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2 Part 2"},{"id":51309,"type":"ONA","title":"Sukuwareru Ramiris"},{"id":54050,"type":"CM","title":"He Wei Dao x Guan Yu Wo Zhuan Sheng Bian Cheng Shi Lai Mu Zhe Dang Shi"},{"id":49877,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen","title_alt":"That Time I Got Reincarnated as a Slime: The Movie - Scarlet Bond"},{"id":55720,"type":"ONA","title":"Genjitsu no Rimuru: Sunshine in the Slime"},{"id":57434,"type":"Special","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen Specials"},{"id":54565,"type":"ONA","title":"Tensei shitara Slime Datta Ken: Coleus no Yume","title_alt":"That Time I Got Reincarnated as a Slime: Visions of Coleus"},{"id":58592,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 3rd Season: Kanwa - Diablo Nikki","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Diablo's Journal"},{"id":53580,"type":"TV","title":"Tensei shitara Slime Datta Ken 3rd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 3"},{"id":59493,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Luminous Memories","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Luminous Memories"},{"id":59971,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie 2: Soukai no Namida-hen","title_alt":"That Time I Got Reincarnated as a Slime the Movie: Tears of the Azure Sea"},{"id":59970,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season","title_alt":"That Time I Got Reincarnated as a Slime Season 4"},{"id":63129,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 4 Part 2"}],"61316":[{"id":31240,"type":"TV","title":"Re:Zero kara Hajimeru Isekai Seikatsu","title_alt":"Re:ZERO -Starting Life in Another World-"},{"id":33142,"type":"TV Special","title":"Re:Zero kara Hajimeru Break Time"},{"id":33569,"type":"Special","title":"Re:Petit kara Hajimeru Isekai Seikatsu"},{"id":42776,"type":"PV","title":"Re:Zero kara Hajimeru Isekai Seikatsu - Memory Snow Announcement"},{"id":38389,"type":"CM","title":"He Wei Dao x Re:Cong Ling Kaishi de Yi Shijie Shenghuo"},{"id":39921,"type":"Movie","title":"Re:Zero kara Hajimeru Isekai Seikatsu - Memory Snow - Manner Movie"},{"id":36286,"type":"Movie","title":"Re:Zero kara Hajimeru Isekai Seikatsu - Memory Snow","title_alt":"Re:ZERO -Starting Life in Another World- Memory Snow"},{"id":41590,"type":"Movie","title":"Re:Zero kara Hajimeru Isekai Seikatsu - Hyouketsu no Kizuna - Manner Movie"},{"id":38414,"type":"Movie","title":"Re:Zero kara Hajimeru Isekai Seikatsu - Hyouketsu no Kizuna","title_alt":"Re:ZERO -Starting Life in Another World- The Frozen Bond"},{"id":39587,"type":"TV","title":"Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season","title_alt":"Re:ZERO -Starting Life in Another World- Season 2"},{"id":42364,"type":"Special","title":"Re:Zero kara Hajimeru Break Time 2nd Season"},{"id":42203,"type":"TV","title":"Re:Zero kara Hajimeru Isekai Seikatsu 2nd Season Part 2","title_alt":"Re:ZERO -Starting Life in Another World- Season 2 Part 2"},{"id":54857,"type":"TV","title":"Re:Zero kara Hajimeru Isekai Seikatsu 3rd Season","title_alt":"Re:ZERO -Starting Life in Another World- Season 3"},{"id":60012,"type":"Special","title":"Re:Zero kara Hajimeru Break Time 3rd Season"},{"id":63830,"type":"Special","title":"Re:Zero kara Hajimeru Break Time 4th Season"},{"id":61316,"type":"TV","title":"Re:Zero kara Hajimeru Isekai Seikatsu 4th Season","title_alt":"Re:ZERO -Starting Life in Another World- Season 4"}],"61967":[{"id":33950,"type":"OVA","title":"Black Clover: Jump Festa 2016 Special"},{"id":34572,"type":"TV","title":"Black Clover"},{"id":39864,"type":"Special","title":"Petit Clover Advance"},{"id":38768,"type":"Special","title":"Black Clover: Jump Festa 2018 Special","title_alt":"Black Clover: The All Magic Knights Thanksgiving Festa"},{"id":40031,"type":"ONA","title":"Mugyutto! Black Clover","title_alt":"Squishy! Black Clover"},{"id":48585,"type":"Movie","title":"Black Clover: Mahou Tei no Ken","title_alt":"Black Clover: Sword of the Wizard King"},{"id":61967,"type":"TV","title":"Black Clover 2nd Season","title_alt":"Black Clover Season 2"}],"63129":[{"id":37430,"type":"TV","title":"Tensei shitara Slime Datta Ken","title_alt":"That Time I Got Reincarnated as a Slime"},{"id":39607,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Veldora Nikki","title_alt":"That Time I Got Reincarnated as a Slime: Tales - Veldora's Journal"},{"id":38793,"type":"OVA","title":"Tensei shitara Slime Datta Ken OVA","title_alt":"That Time I Got Reincarnated as a Slime OAD"},{"id":45753,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Hinata Sakaguchi","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Digression - Hinata Sakaguchi"},{"id":39551,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 2"},{"id":41488,"type":"TV","title":"Tensura Nikki: Tensei shitara Slime Datta Ken","title_alt":"The Slime Diaries"},{"id":49318,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 2nd Season: Kanwa - Veldora Nikki 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2: Tales - Veldora's Journal 2"},{"id":41487,"type":"TV","title":"Tensei shitara Slime Datta Ken 2nd Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 2 Part 2"},{"id":51309,"type":"ONA","title":"Sukuwareru Ramiris"},{"id":54050,"type":"CM","title":"He Wei Dao x Guan Yu Wo Zhuan Sheng Bian Cheng Shi Lai Mu Zhe Dang Shi"},{"id":49877,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen","title_alt":"That Time I Got Reincarnated as a Slime: The Movie - Scarlet Bond"},{"id":55720,"type":"ONA","title":"Genjitsu no Rimuru: Sunshine in the Slime"},{"id":57434,"type":"Special","title":"Tensei shitara Slime Datta Ken Movie: Guren no Kizuna-hen Specials"},{"id":54565,"type":"ONA","title":"Tensei shitara Slime Datta Ken: Coleus no Yume","title_alt":"That Time I Got Reincarnated as a Slime: Visions of Coleus"},{"id":58592,"type":"TV Special","title":"Tensei shitara Slime Datta Ken 3rd Season: Kanwa - Diablo Nikki","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Diablo's Journal"},{"id":53580,"type":"TV","title":"Tensei shitara Slime Datta Ken 3rd Season","title_alt":"That Time I Got Reincarnated as a Slime Season 3"},{"id":59493,"type":"TV Special","title":"Tensei shitara Slime Datta Ken: Kanwa - Luminous Memories","title_alt":"That Time I Got Reincarnated as a Slime Season 3: Digression - Luminous Memories"},{"id":59971,"type":"Movie","title":"Tensei shitara Slime Datta Ken Movie 2: Soukai no Namida-hen","title_alt":"That Time I Got Reincarnated as a Slime the Movie: Tears of the Azure Sea"},{"id":59970,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season","title_alt":"That Time I Got Reincarnated as a Slime Season 4"},{"id":63129,"type":"TV","title":"Tensei shitara Slime Datta Ken 4th Season Part 2","title_alt":"That Time I Got Reincarnated as a Slime Season 4 Part 2"}]}} \ No newline at end of file