1
0
cvsa-legacy/src/extractAidsFromEvocalRank.ts
alikia2x b88692e7c1
add: annual archive script, recover the FC proxy
improve the logger, add some error handling in getVideoInfo
2026-01-01 04:49:36 +08:00

374 lines
6.9 KiB
TypeScript

export interface Root {
version: number;
ranknum: number;
url: string;
coverurl: string;
pubdate: string;
generate_time: string;
generate_timestamp: number;
collect_start_time: string;
collect_end_time: string;
collect_start_time_timestamp: number;
collect_end_time_timestamp: number;
main_rank: MainRank[];
second_rank: SecondRank[];
super_hit: SuperHit[];
pick_up: PickUp[];
oth_pickup: any[];
Vocaloid_pick_up: VocaloidPickUp[];
"history-1-year": History1Year[];
"history-10-year": History10Year[];
ed: Ed[];
op: Op[];
statistic: Statistic;
thanks_list: any[];
}
export interface MainRank {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: any;
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
referSource: ReferSource;
rank: number;
ext_rank: ExtRank;
}
export interface ReferSource {
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
}
export interface ExtRank {
vocaloid?: number;
}
export interface SecondRank {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: string;
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
referSource: ReferSource2;
rank: number;
ext_rank: ExtRank2;
}
export interface ReferSource2 {
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
}
export interface ExtRank2 {
vocaloid?: number;
}
export interface SuperHit {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: string;
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
referSource: ReferSource3;
superHit_times: number;
rank: string;
}
export interface ReferSource3 {
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
}
export interface PickUp {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: string;
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
referSource: ReferSource4;
rank: number;
ext_rank: ExtRank4;
}
export interface ReferSource4 {
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
}
export interface ExtRank4 {
vocaloid?: number;
}
export interface VocaloidPickUp {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: string;
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
referSource: ReferSource5;
rank: number;
ext_rank: ExtRank5;
}
export interface ReferSource5 {
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
}
export interface ExtRank5 {
vocaloid: number;
}
export interface History1Year {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: string;
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
referSource: ReferSource6;
rank: number;
ext_rank: ExtRank6;
}
export interface ReferSource6 {
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
}
export interface ExtRank6 {
vocaloid?: number;
}
export interface History10Year {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: string;
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
referSource: ReferSource7;
rank: number;
}
export interface ReferSource7 {
point: number;
play: number;
coin: number;
comment: number;
danmaku: number;
favorite: number;
like: number;
share: number;
}
export interface Ed {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: string;
}
export interface Op {
url: string;
avid: string;
coverurl: string;
title: string;
pubdate: string;
}
export interface Statistic {
diff: Diff;
total_collect_count: number;
new_video_count: number;
new_in_rank_count: number;
new_in_mainrank_count: number;
pick_up_count: number;
oth_pick_up_count: number;
new_vc_in_rank_count: number;
new_vc_in_mainrank_count: number;
vc_in_rank_count: number;
vc_in_mainrank_count: number;
new_sv_in_rank_count: number;
new_sv_in_mainrank_count: number;
sv_in_rank_count: number;
sv_in_mainrank_count: number;
new_ace_in_rank_count: number;
new_ace_in_mainrank_count: number;
ace_in_rank_count: number;
ace_in_mainrank_count: number;
}
export interface Diff {
total_play: number;
new_video_count: number;
new_in_rank_count: number;
new_in_mainrank_count: number;
new_vc_in_rank_count: number;
new_vc_in_mainrank_count: number;
vc_in_rank_count: number;
vc_in_mainrank_count: number;
new_sv_in_rank_count: number;
new_sv_in_mainrank_count: number;
sv_in_rank_count: number;
sv_in_mainrank_count: number;
new_ace_in_rank_count: number;
new_ace_in_mainrank_count: number;
ace_in_rank_count: number;
ace_in_mainrank_count: number;
}
const aids = new Set<string>();
const f = Bun.file("evocalrank.json");
for (let i = 699; i >= 520; i--) {
const url = `https://www.evocalrank.com/data/rank_data/${i}.json`;
const response = await fetch(url);
const data = await response.json() as Partial<Root>;
if (data.main_rank) {
for (const item of data.main_rank) {
if (item.avid) {
aids.add(item.avid);
}
}
}
if (data.second_rank) {
for (const item of data.second_rank) {
if (item.avid) {
aids.add(item.avid);
}
}
}
if (data.pick_up) {
for (const item of data.pick_up) {
if (item.avid) {
aids.add(item.avid);
}
}
}
if (data.super_hit) {
for (const item of data.super_hit) {
if (item.avid) {
aids.add(item.avid);
}
}
}
if (data.Vocaloid_pick_up) {
for (const item of data.Vocaloid_pick_up) {
if (item.avid) {
aids.add(item.avid);
}
}
}
if (data.ed) {
for (const item of data.ed) {
if (item.avid) {
aids.add(item.avid);
}
}
}
if (data.op) {
for (const item of data.op) {
if (item.avid) {
aids.add(item.avid);
}
}
}
const serialized = JSON.stringify([...aids], null, 4);
await f.write(serialized);
console.log(`${i} ${aids.size}`);
}