mirror of
https://git.ethanthesleepy.one/ethanaobrien/ew
synced 2026-08-26 23:12:20 +08:00
Compare commits
149 Commits
v1.0.0
...
582d56c301
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
582d56c301 | ||
|
|
0b0bef7bfb | ||
|
|
29ed7a1b46 | ||
|
|
b4cd6968d8 | ||
|
|
ee1a3d827e | ||
|
|
f75891dea0 | ||
|
|
26926e1a28 | ||
|
|
d077210efe | ||
|
|
5d31cbad29 | ||
|
|
f5bb3a5c7d | ||
|
|
7a4da25358 | ||
|
|
6609a1ae77 | ||
|
|
ebfc15d2b9 | ||
|
|
d8f3c75236 | ||
|
|
6523ad4d4a | ||
|
|
2056511bd1 | ||
|
|
352ff2dbc5 | ||
|
|
b5bd8ad4fb | ||
|
|
3ca5dcf1ea | ||
|
|
d06aaae9ac | ||
|
|
54bd50d721 | ||
|
|
a2089f12bd | ||
|
|
04e40d38e5 | ||
|
|
14e02090b8 | ||
|
|
c745e6e785 | ||
|
|
042e92cb24 | ||
|
|
e7d865ebb8 | ||
|
|
3a29fde575 | ||
|
|
4ebcc06d56 | ||
|
|
59ac1f55c3 | ||
|
|
6eec06e164 | ||
|
|
0b0b50de36 | ||
|
|
2cd11c8467 | ||
|
|
b6cbfd0713 | ||
|
|
50ccecd821 | ||
|
|
e41d4e61b9 | ||
|
|
fcaecc7b41 | ||
|
|
0bf1262b5b | ||
|
|
ed195abb3b | ||
|
|
11cd0b72c1 | ||
|
|
e0bee026dd | ||
|
|
c838228322 | ||
|
|
b7e63ab0e5 | ||
|
|
41c72919db | ||
|
|
c9316a1b40 | ||
|
|
e51058a7e9 | ||
|
|
2aa2c6f2eb | ||
|
|
7a72672451 | ||
|
|
45a6d90575 | ||
|
|
47fa13259f | ||
|
|
41b6e8f3c2 | ||
|
|
7a8859b990 | ||
|
|
cdcc3811c2 | ||
|
|
82e8606ea1 | ||
|
|
1a00e869b4 | ||
|
|
c71b935b94 | ||
|
|
128f53998b | ||
|
|
9cf0ee8924 | ||
|
|
f04ffc2f5d | ||
|
|
6b465eca8e | ||
|
|
d4a6a56a27 | ||
|
|
8d8b9dec9f | ||
|
|
dc9e19ead6 | ||
|
|
87109005bb | ||
|
|
bfa9a12194 | ||
|
|
e631b34945 | ||
|
|
df83adf710 | ||
|
|
5f6dd7cbc0 | ||
|
|
6d7e9bc32e | ||
|
|
3d83959aab | ||
|
|
b584fbe97f | ||
|
|
d34b5fc6a4 | ||
|
|
29f56a18cb | ||
|
|
154a38a013 | ||
|
|
6ebf452632 | ||
|
|
b665181eab | ||
|
|
df7ed0c946 | ||
|
|
e6e0477825 | ||
|
|
463a271b14 | ||
|
|
982e8ba70e | ||
|
|
e9c84be5fa | ||
|
|
95c31f9e54 | ||
|
|
f7611937cc | ||
|
|
902fbaec55 | ||
|
|
67a849e506 | ||
|
|
d017fc43bb | ||
|
|
ad0009baf6 | ||
|
|
4f42e5029b | ||
|
|
dc0a62aca4 | ||
|
|
11e40a09cf | ||
|
|
4ee5b00aef | ||
|
|
0d79deddae | ||
|
|
86e1e6050a | ||
|
|
956634d8ab | ||
|
|
8a1d33bd2b | ||
|
|
aef2c4986d | ||
|
|
b35aa35b1a | ||
|
|
0ef0a83685 | ||
|
|
586f4612ed | ||
|
|
f0183370be | ||
|
|
f4fe727a0e | ||
|
|
d61b27af8f | ||
|
|
8e4300a7ea | ||
|
|
8a666a56b5 | ||
|
|
f4fcbf30ed | ||
|
|
db46013ee0 | ||
|
|
0b532ee191 | ||
|
|
95c253b65a | ||
|
|
c4ba03b289 | ||
|
|
2effc61292 | ||
|
|
54e84fbaac | ||
|
|
41b3ea2c7f | ||
|
|
4836f332f0 | ||
|
|
da49d06209 | ||
|
|
6688655370 | ||
|
|
955e3819b5 | ||
|
|
591990a040 | ||
|
|
0fc7f1d36e | ||
|
|
15155bd8df | ||
|
|
816589ae22 | ||
|
|
d14533d966 | ||
|
|
697f4188c2 | ||
|
|
01f3a42613 | ||
|
|
6d541a81ef | ||
|
|
b9f9929ea9 | ||
|
|
2cc2138eda | ||
|
|
bab9868355 | ||
|
|
ad0d222c96 | ||
|
|
60eb7d469b | ||
|
|
66f97c48ee | ||
|
|
d4a5f0dd11 | ||
|
|
9a072823a0 | ||
|
|
74a00769aa | ||
|
|
fd47262f52 | ||
|
|
b9b344b50c | ||
|
|
99da87095b | ||
|
|
d1ee220edb | ||
|
|
3343d4fdd6 | ||
|
|
6b34316bad | ||
|
|
9686f3a6ef | ||
|
|
1172b4bd11 | ||
|
|
8da6938fb3 | ||
|
|
76c870547c | ||
|
|
038a651202 | ||
|
|
4aa00fd3d8 | ||
|
|
222021382f | ||
|
|
1a736155e3 | ||
|
|
e27a020cfb | ||
|
|
b082def65c |
@@ -8,17 +8,14 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checking out branch
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '18'
|
||||
|
||||
- name: Set up QEMU
|
||||
id: qemu
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
platforms: arm64
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
@@ -26,7 +23,7 @@ jobs:
|
||||
- name: Extract version from Cargo.toml
|
||||
shell: bash
|
||||
run: |
|
||||
echo "EW_VERSION=$(grep "^version" Cargo.toml | sed -E 's/version\s*=\s*["]([^"]*)["]/\1/')" >> $GITHUB_ENV
|
||||
echo "APP_VERSION=$(grep "^version" Cargo.toml | sed -E 's/version\s*=\s*["]([^"]*)["]/\1/')" >> $GITHUB_ENV
|
||||
|
||||
- name: Log in to DockerHub
|
||||
uses: docker/login-action@v3
|
||||
@@ -52,12 +49,11 @@ jobs:
|
||||
push: true
|
||||
labels: |
|
||||
gitsha1=${{ github.sha }}
|
||||
org.opencontainers.image.version=${{ env.EW_VERSION }}
|
||||
tags: "${{ steps.set-tag.outputs.tags }}"
|
||||
org.opencontainers.image.version=${{ env.APP_VERSION }}
|
||||
tags: |
|
||||
${{ steps.set-tag.outputs.tags }}
|
||||
docker.io/ethanaobrien/ew:${{ env.APP_VERSION }}
|
||||
file: "docker/Dockerfile"
|
||||
platforms: linux/amd64 #,linux/arm64
|
||||
|
||||
# arm64 builds OOM without the git fetch setting. c.f.
|
||||
# https://github.com/rust-lang/cargo/issues/10583
|
||||
build-args: |
|
||||
CARGO_NET_GIT_FETCH_WITH_CLI=true
|
||||
platforms: linux/amd64, linux/arm64
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
@@ -2,7 +2,8 @@ name: Build release binaries
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: 'v*'
|
||||
branches: '**'
|
||||
tags: '*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -10,41 +11,92 @@ jobs:
|
||||
steps:
|
||||
- name: Checking out branch
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: Install Rust
|
||||
shell: bash
|
||||
run: curl -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --default-toolchain stable --profile minimal
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v2
|
||||
- name: Install android NDK
|
||||
id: setup-ndk
|
||||
uses: https://github.com/nttld/setup-ndk@v1
|
||||
with:
|
||||
node-version: '18'
|
||||
ndk-version: r29
|
||||
|
||||
- name: Create out directory
|
||||
run: |
|
||||
mkdir out
|
||||
|
||||
- name: Build webui
|
||||
run: |
|
||||
cd webui
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
- name: Build x86_64-unknown-linux-gnu
|
||||
- name: Install cargo ndk
|
||||
shell: bash
|
||||
run: |
|
||||
. "$HOME/.cargo/env"
|
||||
cargo build --target x86_64-unknown-linux-gnu --release || echo "Failed to build"
|
||||
mv target/x86_64-unknown-linux-gnu/release/ew out/ew-x86_64-unknown-linux-gnu
|
||||
cargo install cargo-ndk
|
||||
rustup target add aarch64-linux-android
|
||||
|
||||
- name: Build x86_64-pc-windows-gnu
|
||||
- name: Write cargo linker config
|
||||
shell: bash
|
||||
env:
|
||||
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
|
||||
run: |
|
||||
mkdir -p .cargo
|
||||
echo "[target.aarch64-linux-android]" > .cargo/config.toml
|
||||
echo "linker = \"$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang\"" >> .cargo/config.toml
|
||||
echo "ar = \"$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar\"" >> .cargo/config.toml
|
||||
echo "" >> .cargo/config.toml
|
||||
echo "[target.aarch64-unknown-linux-gnu]" >> .cargo/config.toml
|
||||
echo "linker = \"aarch64-linux-gnu-gcc\"" >> .cargo/config.toml
|
||||
echo "ar = \"aarch64-linux-gnu-ar\"" >> .cargo/config.toml
|
||||
echo "" >> .cargo/config.toml
|
||||
echo "[target.x86_64-linux-android]" >> .cargo/config.toml
|
||||
echo "linker = \"$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android21-clang\"" >> .cargo/config.toml
|
||||
echo "ar = \"$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar\"" >> .cargo/config.toml
|
||||
|
||||
- name: Build Stuff
|
||||
shell: bash
|
||||
env:
|
||||
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
|
||||
run: |
|
||||
. "$HOME/.cargo/env"
|
||||
sudo apt update && sudo apt install gcc-mingw-w64 -y
|
||||
rustup target add x86_64-pc-windows-gnu
|
||||
cargo build --target x86_64-pc-windows-gnu --release || echo "Failed to build"
|
||||
mv target/x86_64-pc-windows-gnu/release/ew.exe out/ew-x86_64-pc-windows-gnu.exe
|
||||
export PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/
|
||||
sudo apt update && sudo apt install gcc-mingw-w64 gcc-aarch64-linux-gnu -y
|
||||
|
||||
arr=("aarch64-linux-android" "aarch64-unknown-linux-gnu" "x86_64-linux-android" "x86_64-pc-windows-gnu" "x86_64-unknown-linux-gnu")
|
||||
for target in "${arr[@]}"; do
|
||||
rustup target add $target
|
||||
cargo build --target $target --release || echo "Failed to build"
|
||||
if [[ "$target" == *"windows"* ]]; then
|
||||
mv target/$target/release/ew.exe out/ew-$target.exe
|
||||
else
|
||||
mv target/$target/release/ew out/ew-$target
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Patch for library build
|
||||
run: |
|
||||
sed -i 's|#\[lib\]|\[lib\]|g' Cargo.toml
|
||||
sed -i 's|#crate-type|crate-type|g' Cargo.toml
|
||||
sed -i 's|#required-features|required-features|g' Cargo.toml
|
||||
|
||||
- name: Build jnilibs
|
||||
shell: bash
|
||||
env:
|
||||
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
|
||||
run: |
|
||||
. "$HOME/.cargo/env"
|
||||
cargo ndk -t arm64-v8a build --release --features library
|
||||
mv target/aarch64-linux-android/release/libew.so out/libew-aarch64-linux-android.so
|
||||
|
||||
- name: Upload artifacts
|
||||
if: startsWith(github.ref, 'refs/heads/')
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: output
|
||||
path: ./out/
|
||||
|
||||
- name: Publish release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: actions/forgejo-release@v2
|
||||
with:
|
||||
direction: upload
|
||||
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -7,3 +7,8 @@ webui/node_modules/
|
||||
webui/dist/
|
||||
config.json
|
||||
docker/data/
|
||||
.idea/
|
||||
ndk/
|
||||
.DS_Store
|
||||
custom_songs/
|
||||
custom_cards/
|
||||
|
||||
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
[submodule "assets"]
|
||||
path = assets
|
||||
url = https://git.ethanthesleepy.one/ethanaobrien/sif2-runtime-files
|
||||
[submodule "webui"]
|
||||
path = webui
|
||||
url = https://git.ethanthesleepy.one/ethanaobrien/ew-webui
|
||||
3333
Cargo.lock
generated
3333
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
71
Cargo.toml
71
Cargo.toml
@@ -1,30 +1,59 @@
|
||||
[package]
|
||||
name = "ew"
|
||||
version = "1.0.0"
|
||||
edition = "2021"
|
||||
version = "1.1.0"
|
||||
edition = "2024"
|
||||
exclude = ["assets", "*.db"]
|
||||
|
||||
[dependencies]
|
||||
actix-web = { version = "4.9.0" }
|
||||
rusqlite = { version = "0.32.1", features = ["bundled"] }
|
||||
openssl = { version = "0.10", features = ["vendored"] }
|
||||
reqwest = { version = "0.12", features = ["blocking"] }
|
||||
clap = { version = "4.5.21", features = ["derive"]}
|
||||
actix-web = "4.13"
|
||||
rusqlite = { version = "0.39.0", features = ["bundled"] }
|
||||
clap = { version = "4.5.59", features = ["derive"]}
|
||||
base64 = "0.22.1"
|
||||
json = "0.12.4"
|
||||
rand = "0.8.5"
|
||||
rand = "0.10.0"
|
||||
lazy_static = "1.5.0"
|
||||
chrono = "0.4.38"
|
||||
hex = "0.4.3"
|
||||
hmac = "0.12.1"
|
||||
md5 = "0.7.0"
|
||||
hmac = "0.13.0"
|
||||
md5 = "0.8.0"
|
||||
urlencoding = "2.1.3"
|
||||
sha1 = "0.10.6"
|
||||
substring = "1.4.5"
|
||||
uuid = { version = "1.11.0", features = ["v7"] }
|
||||
rsa = "0.9.6"
|
||||
sha1 = "0.11.0"
|
||||
uuid = { version = "1.21.0", features = ["v7"] }
|
||||
# This needs to be on 0.10.* to be able to bump other crates. This is probably fine
|
||||
rsa = { version = "0.10.0-rc.18", features = ["sha1"] }
|
||||
mime = "0.3.17"
|
||||
sha2 = "0.10.8"
|
||||
include-flate-codegen = "0.3.0"
|
||||
libflate = "2.1.0"
|
||||
serde_json = "1.0.133"
|
||||
serde = { version = "1.0.215", features = ["derive"] }
|
||||
sha2 = "0.11.0"
|
||||
include-flate-codegen = "0.3.1"
|
||||
libflate = "2.2.1"
|
||||
cbc = { version = "0.2.0", features = ["alloc"] }
|
||||
aes = "0.9.0"
|
||||
pem = "3.0.6"
|
||||
ureq = "3.2.0"
|
||||
mime_guess = "2.0.5"
|
||||
include_dir = "0.7.4"
|
||||
jzon = "0.12.5"
|
||||
csv = "1.3"
|
||||
actix-multipart = "0.8"
|
||||
futures-util = "0.3"
|
||||
image = "0.25"
|
||||
zip = { version = "8.6", default-features = false, features = ["deflate"] }
|
||||
symphonia = { version = "0.6", default-features = false, features = ["ogg", "vorbis", "mp3", "wav", "pcm"] }
|
||||
vorbis_rs = "0.5"
|
||||
argon2 = { version = "0.5.3", features = ["std"] }
|
||||
rand_core = "0.10"
|
||||
|
||||
[target.aarch64-linux-android.dependencies]
|
||||
jni = { version = "0.21", features = ["invocation", "default"], optional = true }
|
||||
|
||||
[target.aarch64-apple-ios.dependencies]
|
||||
objc2 = { version = "0.6.3", optional = true }
|
||||
objc2-foundation = { version = "0.3.2", features = ["NSFileManager"], optional = true }
|
||||
|
||||
[build-dependencies]
|
||||
cc = "1.2"
|
||||
|
||||
# To enable this library you MUST comment out lib block below and add --features library
|
||||
[features]
|
||||
library = ["jni", "objc2", "objc2-foundation"]
|
||||
|
||||
#[lib]
|
||||
#crate-type = ["cdylib"]
|
||||
#required-features = ["library"]
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
ew Copyright (C) 2024-2025 Ethan O'Brien
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
const express = require('express')
|
||||
const app = express()
|
||||
const fs = require('fs');
|
||||
var http = require('http');
|
||||
|
||||
const ip = '0.0.0.0';
|
||||
const port = 8887;
|
||||
//https://lovelive-schoolidolfestival2-album.akamaized.net
|
||||
app.use(function (req, res, next) {
|
||||
console.log(req.method, ":", req.url);
|
||||
next();
|
||||
})
|
||||
function createDirFromFile(path) {
|
||||
fs.mkdirSync(require('path').dirname(path), { recursive: true });
|
||||
}
|
||||
|
||||
app.get('/*', function (req, res) {
|
||||
const expectedPath = __dirname + "/resources"+req.url.split("?")[0];
|
||||
createDirFromFile(expectedPath);
|
||||
|
||||
let downloading = [];
|
||||
if (fs.existsSync(expectedPath)) {
|
||||
res.sendFile(expectedPath)
|
||||
} else {
|
||||
let url;
|
||||
if (req.url.split("/")[2].length !== 2) {
|
||||
url = (req.url.toLowerCase().startsWith("/android") || req.url.toLowerCase().startsWith("/ios") ? "https://lovelive-schoolidolfestival2-assets.akamaized.net" : "https://lovelive-schoolidolfestival2-album.akamaized.net") + req.url;
|
||||
} else {
|
||||
url = (req.url.toLowerCase().startsWith("/android") || req.url.toLowerCase().startsWith("/ios") ? "https://img-sif2.lovelive-sif2.com" : "https://album-sif2.lovelive-sif2.com") + req.url;
|
||||
}
|
||||
const request = require('https').get(url, function(response) {
|
||||
response.pipe(res);
|
||||
});
|
||||
if (downloading.includes(req.url)) return;
|
||||
require('https').get(url, function(response) {
|
||||
console.log("Downloading " + req.url);
|
||||
downloading.push(req.url);
|
||||
const file = fs.createWriteStream(expectedPath);
|
||||
response.pipe(file);
|
||||
|
||||
// after download completed close filestream
|
||||
file.on("finish", () => {
|
||||
file.close();
|
||||
console.log("Download Completed " + req.url);
|
||||
});
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
var httpsServer = http.createServer(app);
|
||||
|
||||
|
||||
httpsServer.listen(port, ip, () => {
|
||||
let url = 'http://' + ip + ':' + port
|
||||
console.log('Server is listening at', url)
|
||||
})
|
||||
690
asset_server/package-lock.json
generated
690
asset_server/package-lock.json
generated
@@ -1,690 +0,0 @@
|
||||
{
|
||||
"name": "a",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"express": "^4.18.2"
|
||||
}
|
||||
},
|
||||
"node_modules/accepts": {
|
||||
"version": "1.3.8",
|
||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
|
||||
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
|
||||
"dependencies": {
|
||||
"mime-types": "~2.1.34",
|
||||
"negotiator": "0.6.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/array-flatten": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
|
||||
},
|
||||
"node_modules/body-parser": {
|
||||
"version": "1.20.1",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
|
||||
"integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
"content-type": "~1.0.4",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"on-finished": "2.4.1",
|
||||
"qs": "6.11.0",
|
||||
"raw-body": "2.5.1",
|
||||
"type-is": "~1.6.18",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8",
|
||||
"npm": "1.2.8000 || >= 1.4.16"
|
||||
}
|
||||
},
|
||||
"node_modules/bytes": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
|
||||
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"set-function-length": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/content-disposition": {
|
||||
"version": "0.5.4",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
|
||||
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
|
||||
"dependencies": {
|
||||
"safe-buffer": "5.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/content-type": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
|
||||
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie": {
|
||||
"version": "0.5.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
|
||||
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"dependencies": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/define-data-property": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
||||
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/depd": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
||||
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/destroy": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
|
||||
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
|
||||
"engines": {
|
||||
"node": ">= 0.8",
|
||||
"npm": "1.2.8000 || >= 1.4.16"
|
||||
}
|
||||
},
|
||||
"node_modules/ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
|
||||
},
|
||||
"node_modules/encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-errors": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
||||
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
|
||||
},
|
||||
"node_modules/etag": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/express": {
|
||||
"version": "4.18.2",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
|
||||
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
|
||||
"dependencies": {
|
||||
"accepts": "~1.3.8",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.20.1",
|
||||
"content-disposition": "0.5.4",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.5.0",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"finalhandler": "1.2.0",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "2.0.0",
|
||||
"merge-descriptors": "1.0.1",
|
||||
"methods": "~1.1.2",
|
||||
"on-finished": "2.4.1",
|
||||
"parseurl": "~1.3.3",
|
||||
"path-to-regexp": "0.1.7",
|
||||
"proxy-addr": "~2.0.7",
|
||||
"qs": "6.11.0",
|
||||
"range-parser": "~1.2.1",
|
||||
"safe-buffer": "5.2.1",
|
||||
"send": "0.18.0",
|
||||
"serve-static": "1.15.0",
|
||||
"setprototypeof": "1.2.0",
|
||||
"statuses": "2.0.1",
|
||||
"type-is": "~1.6.18",
|
||||
"utils-merge": "1.0.1",
|
||||
"vary": "~1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/finalhandler": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
|
||||
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
|
||||
"dependencies": {
|
||||
"debug": "2.6.9",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"on-finished": "2.4.1",
|
||||
"parseurl": "~1.3.3",
|
||||
"statuses": "2.0.1",
|
||||
"unpipe": "~1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/forwarded": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
||||
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/fresh": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
||||
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.1.3"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-property-descriptors": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
||||
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-proto": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
||||
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-symbols": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
|
||||
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/hasown": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz",
|
||||
"integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==",
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/http-errors": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
|
||||
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
|
||||
"dependencies": {
|
||||
"depd": "2.0.0",
|
||||
"inherits": "2.0.4",
|
||||
"setprototypeof": "1.2.0",
|
||||
"statuses": "2.0.1",
|
||||
"toidentifier": "1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/iconv-lite": {
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||
"dependencies": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"node_modules/ipaddr.js": {
|
||||
"version": "1.9.1",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
||||
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
|
||||
"engines": {
|
||||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
|
||||
},
|
||||
"node_modules/methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
||||
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
|
||||
"bin": {
|
||||
"mime": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"dependencies": {
|
||||
"mime-db": "1.52.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
|
||||
},
|
||||
"node_modules/negotiator": {
|
||||
"version": "0.6.3",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
|
||||
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/object-inspect": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/on-finished": {
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
|
||||
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
|
||||
"dependencies": {
|
||||
"ee-first": "1.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/parseurl": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
|
||||
},
|
||||
"node_modules/proxy-addr": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
|
||||
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
|
||||
"dependencies": {
|
||||
"forwarded": "0.2.0",
|
||||
"ipaddr.js": "1.9.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/qs": {
|
||||
"version": "6.11.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
|
||||
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
|
||||
"dependencies": {
|
||||
"side-channel": "^1.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.6"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/range-parser": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
||||
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/raw-body": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
|
||||
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
|
||||
"dependencies": {
|
||||
"bytes": "3.1.2",
|
||||
"http-errors": "2.0.0",
|
||||
"iconv-lite": "0.4.24",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"node_modules/send": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
|
||||
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
|
||||
"dependencies": {
|
||||
"debug": "2.6.9",
|
||||
"depd": "2.0.0",
|
||||
"destroy": "1.2.0",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "2.0.0",
|
||||
"mime": "1.6.0",
|
||||
"ms": "2.1.3",
|
||||
"on-finished": "2.4.1",
|
||||
"range-parser": "~1.2.1",
|
||||
"statuses": "2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/send/node_modules/ms": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
||||
},
|
||||
"node_modules/serve-static": {
|
||||
"version": "1.15.0",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
||||
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
|
||||
"dependencies": {
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"parseurl": "~1.3.3",
|
||||
"send": "0.18.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/set-function-length": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
|
||||
"integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
|
||||
"dependencies": {
|
||||
"define-data-property": "^1.1.2",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.3",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/setprototypeof": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
|
||||
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
|
||||
},
|
||||
"node_modules/side-channel": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz",
|
||||
"integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.6",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"object-inspect": "^1.13.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/statuses": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
|
||||
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/toidentifier": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
|
||||
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
|
||||
"engines": {
|
||||
"node": ">=0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/type-is": {
|
||||
"version": "1.6.18",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
||||
"dependencies": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "~2.1.24"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/unpipe": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/utils-merge": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
|
||||
"engines": {
|
||||
"node": ">= 0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vary": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"express": "^4.18.2"
|
||||
}
|
||||
}
|
||||
1
assets
Submodule
1
assets
Submodule
Submodule assets added at dbb068e72c
20
build.rs
Normal file
20
build.rs
Normal file
@@ -0,0 +1,20 @@
|
||||
fn main() {
|
||||
println!("cargo:rerun-if-changed=build.rs");
|
||||
println!("cargo:rerun-if-changed=src");
|
||||
println!("cargo:rerun-if-changed=webui/index.html");
|
||||
|
||||
let target = std::env::var("TARGET").unwrap();
|
||||
if target == "aarch64-linux-android" {
|
||||
println!("cargo:rerun-if-changed=build.rs");
|
||||
println!("cargo:rustc-link-arg=-Wl,-z,max-page-size=65536");
|
||||
|
||||
cc::Build::new()
|
||||
.file("src/log.c")
|
||||
.compile("libc_code.a");
|
||||
println!("cargo:rerun-if-changed=src/log.c");
|
||||
}
|
||||
|
||||
if !std::fs::exists("webui/index.html").unwrap_or(false) {
|
||||
panic!("Missing webui! Did you pull submodules?\nRun `git submodule update --init --recursive`");
|
||||
}
|
||||
}
|
||||
@@ -1,32 +1,38 @@
|
||||
FROM docker.io/library/debian:latest AS builder
|
||||
# syntax=docker/dockerfile:1
|
||||
|
||||
# First - build
|
||||
|
||||
RUN apt update && apt install -y curl libssl-dev perl git gcc make
|
||||
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash
|
||||
RUN apt update && apt install -y nodejs
|
||||
RUN curl -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --default-toolchain stable --profile minimal
|
||||
FROM --platform=$BUILDPLATFORM rust:bookworm AS builder
|
||||
|
||||
WORKDIR /ew/
|
||||
ARG TARGETARCH
|
||||
|
||||
COPY ./ ./
|
||||
WORKDIR /ew
|
||||
|
||||
WORKDIR /ew/webui/
|
||||
RUN apt-get update \
|
||||
&& case "$TARGETARCH" in \
|
||||
amd64) echo x86_64-unknown-linux-gnu > /rust-target ;; \
|
||||
arm64) apt-get install -y --no-install-recommends \
|
||||
gcc-aarch64-linux-gnu libc6-dev-arm64-cross \
|
||||
&& rustup target add aarch64-unknown-linux-gnu \
|
||||
&& echo aarch64-unknown-linux-gnu > /rust-target ;; \
|
||||
*) echo "Unsupported TARGETARCH: $TARGETARCH" >&2; exit 1 ;; \
|
||||
esac \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN npm i && npm run build
|
||||
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
|
||||
CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc \
|
||||
AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-ar
|
||||
|
||||
WORKDIR /ew/
|
||||
COPY . .
|
||||
|
||||
RUN . "$HOME/.cargo/env" && cargo build --release
|
||||
|
||||
## Second - sort stuff idk
|
||||
# Cache
|
||||
RUN --mount=type=cache,target=/usr/local/cargo/registry,sharing=locked \
|
||||
--mount=type=cache,target=/ew/target,id=ew-target-${TARGETARCH},sharing=locked \
|
||||
cargo build --release --target "$(cat /rust-target)" \
|
||||
&& cp "target/$(cat /rust-target)/release/ew" /usr/local/bin/ew
|
||||
|
||||
FROM docker.io/library/debian:bookworm-slim
|
||||
|
||||
RUN mkdir -p /root/ew/
|
||||
COPY --from=builder /ew/target/release/ew /root/ew/ew
|
||||
COPY ./docker/start.sh /root/ew/start.sh
|
||||
|
||||
RUN chmod +x /root/ew/start.sh
|
||||
COPY --from=builder --chmod=755 /usr/local/bin/ew /root/ew/ew
|
||||
COPY --chmod=755 ./docker/start.sh /root/ew/start.sh
|
||||
|
||||
ENTRYPOINT ["/root/ew/start.sh"]
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
version: '3'
|
||||
services:
|
||||
sif2-ew:
|
||||
image: sif2-ew:latest
|
||||
@@ -14,6 +13,23 @@ services:
|
||||
HIDDEN: false # Will disable the webui
|
||||
DISABLE_IMPORTS: false # Will disable account imports
|
||||
DISABLE_EXPORTS: false # Will disable account exports
|
||||
#ENABLE_CUSTOM_SONGS: true # Custom songs are DISABLED by default; uncomment to enable upload/browse/download (webui + endpoints)
|
||||
#ENABLE_CUSTOM_CARDS: true # Custom cards are DISABLED by default; uncomment to enable runtime card/character uploads (webui + endpoints)
|
||||
#OWNER: "123456789012345" # 15-digit game user id(s) (comma-separated) that hold every permission scope; without an owner nobody can grant scopes or upload cards
|
||||
#PURGE: false # Purge dead user accounts on startup
|
||||
#IMAGE_ASSET_PATH: /images/ # Images for cards in webui (will default to the public server)
|
||||
#MASTERDATA: /masterdata/ # Override bundled CSVs / new_user.json at runtime (missing files fall back to the internal copies)
|
||||
|
||||
# Asset hash / version overrides. Leave unset to use the values bundled in
|
||||
# the binary. ASSET_VERSION is the one version every override below is
|
||||
# served for; each hash replaces what that client is told to expect
|
||||
# (e.g. to track a newer client build).
|
||||
#ASSET_VERSION: ""
|
||||
#JP_ANDROID_ASSET_HASH: ""
|
||||
#JP_IOS_ASSET_HASH: ""
|
||||
#EN_ANDROID_ASSET_HASH: ""
|
||||
#EN_IOS_ASSET_HASH: ""
|
||||
#WINDOWS_ASSET_HASH: "" # Windows asset hash (JP only; GL Windows is unused)
|
||||
|
||||
# Everything below is for the "Help" page
|
||||
#ANDROID_GLOBAL: "link.to/patched/android/global.apk"
|
||||
@@ -25,4 +41,9 @@ services:
|
||||
- 8080:8080
|
||||
volumes:
|
||||
- ./data:/data
|
||||
# You can download from https://git.ethanthesleepy.one/ethanaobrien/ew-webui/releases/download/images/card-thumbnails.zip
|
||||
# No, you should not have a nested folder EXAMPLE: `images/FILENAME.webp`
|
||||
#- ./images:/images
|
||||
# Mirrors the bundled layout: csv/<table>.csv, csv-en/<table>.csv, userdata/new_user.json
|
||||
#- ./masterdata:/masterdata
|
||||
restart: unless-stopped
|
||||
|
||||
@@ -1,28 +1,48 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
port="${PORT:-8080}"
|
||||
directory="${DIRECTORY:-/data/}"
|
||||
args=(
|
||||
--path "${DIRECTORY:-/data/}"
|
||||
--port "${PORT:-8080}"
|
||||
--npps4 "${NPPS4_ADDRESS:-http://127.0.0.1:51376}"
|
||||
--max-time "${MAXTIME:-0}"
|
||||
)
|
||||
|
||||
npps4="${NPPS4_ADDRESS:-http://127.0.0.1:51376}"
|
||||
[ "${HTTPS:-}" = "true" ] && args+=(--https)
|
||||
[ "${HIDDEN:-}" = "true" ] && args+=(--hidden)
|
||||
[ "${PURGE:-}" = "true" ] && args+=(--purge)
|
||||
[ "${DISABLE_IMPORTS:-}" = "true" ] && args+=(--disable-imports)
|
||||
[ "${DISABLE_EXPORTS:-}" = "true" ] && args+=(--disable-exports)
|
||||
[ "${ENABLE_CUSTOM_SONGS:-}" = "true" ] && args+=(--enable-custom-songs)
|
||||
[ "${ENABLE_CUSTOM_CARDS:-}" = "true" ] && args+=(--enable-custom-cards)
|
||||
|
||||
https=$([ "$HTTPS" = "true" ] && echo "--https" || echo "")
|
||||
add_opt() {
|
||||
local value="$1" flag="$2"
|
||||
if [ -n "$value" ]; then
|
||||
args+=("$flag" "$value")
|
||||
fi
|
||||
}
|
||||
|
||||
hidden=$([ "$HIDDEN" = "true" ] && echo "--hidden" || echo "")
|
||||
# Asset hash / version overrides
|
||||
add_opt "${ASSET_VERSION:-}" --asset-version
|
||||
add_opt "${JP_ANDROID_ASSET_HASH:-}" --jp-android-asset-hash
|
||||
add_opt "${JP_IOS_ASSET_HASH:-}" --jp-ios-asset-hash
|
||||
add_opt "${EN_ANDROID_ASSET_HASH:-}" --en-android-asset-hash
|
||||
add_opt "${EN_IOS_ASSET_HASH:-}" --en-ios-asset-hash
|
||||
add_opt "${WINDOWS_ASSET_HASH:-}" --windows-asset-hash
|
||||
|
||||
maxTime="${MAXTIME:-0}"
|
||||
# Server owner uid(s) for the permission system (comma-separated)
|
||||
add_opt "${OWNER:-}" --owner
|
||||
|
||||
purge=$([ "$PURGE" = "true" ] && echo "--purge" || echo "")
|
||||
# Asset / image paths.
|
||||
add_opt "${IMAGE_ASSET_PATH:-}" --image-asset-path
|
||||
add_opt "${MASTERDATA:-}" --masterdata
|
||||
|
||||
imports=$([ "$DISABLE_IMPORTS" = "true" ] && echo "--disable-imports" || echo "")
|
||||
# "Help" page download links + asset server.
|
||||
add_opt "${ANDROID_GLOBAL:-}" --global-android
|
||||
add_opt "${ANDROID_JAPAN:-}" --japan-android
|
||||
add_opt "${IOS_GLOBAL:-}" --global-ios
|
||||
add_opt "${IOS_JAPAN:-}" --japan-ios
|
||||
add_opt "${ASSET_URL:-}" --assets-url
|
||||
|
||||
exports=$([ "$DISABLE_EXPORTS" = "true" ] && echo "--disable-exports" || echo "")
|
||||
|
||||
asset_android_jp=$([ "$JP_ANDROID_ASSET_HASH" != "" ] && echo "--jp-android-asset-hash $JP_ANDROID_ASSET_HASH" || echo "")
|
||||
|
||||
asset_ios_jp=$([ "$JP_IOS_ASSET_HASH" != "" ] && echo "--jp-ios-asset-hash $JP_IOS_ASSET_HASH" || echo "")
|
||||
|
||||
asset_android_en=$([ "$EN_ANDROID_ASSET_HASH" != "" ] && echo "--en-android-asset-hash $EN_ANDROID_ASSET_HASH" || echo "")
|
||||
|
||||
asset_ios_en=$([ "$EN_IOS_ASSET_HASH" != "" ] && echo "--en-ios-asset-hash $EN_IOS_ASSET_HASH" || echo "")
|
||||
|
||||
/root/ew/ew --path $directory --port $port --npps4 $npps4 $asset_android_jp $asset_ios_jp $asset_android_en $asset_ios_en $exports $imports $purge $hidden $https --global-android "$ANDROID_GLOBAL" --japan-android "$ANDROID_JAPAN" --global-ios "$IOS_GLOBAL" --japan-ios "$IOS_JAPAN" --assets-url "$ASSET_URL" --max-time $maxTime
|
||||
exec /root/ew/ew "${args[@]}"
|
||||
|
||||
24
readme.md
24
readme.md
@@ -5,27 +5,15 @@ A (mostly functioning) server for Love Live! School idol festival 2 MIRACLE LIVE
|
||||
|
||||
## Building
|
||||
|
||||
### Linux
|
||||
|
||||
#### Requirements
|
||||
- [perl](https://www.perl.org/get.html) (This is normally pre-installed)
|
||||
- [rust](https://www.rust-lang.org/tools/install)
|
||||
- [npm](https://www.npmjs.com/)
|
||||
- The [libssl-dev](https://packages.debian.org/buster/libssl-dev) package. This will vary across distros.
|
||||
|
||||
`apt install -y npm libssl-dev perl`
|
||||
|
||||
### Windows
|
||||
|
||||
#### Requirements
|
||||
- [Strawberry Perl](https://strawberryperl.com/)
|
||||
### Requirements
|
||||
- [rust](https://www.rust-lang.org/tools/install)
|
||||
|
||||
### Packaging/Running
|
||||
|
||||
**Build npm:**
|
||||
`cd webui && npm install && npm run build`
|
||||
|
||||
**Build Rust:**
|
||||
**Build:**
|
||||
Debug: `cargo run`
|
||||
Release: `cargo build --release`
|
||||
|
||||
**Docker:**
|
||||
`docker build --tag ew --file docker/Dockerfile .`
|
||||
Will create docker image with tag "ew"
|
||||
|
||||
79
src/android.rs
Normal file
79
src/android.rs
Normal file
@@ -0,0 +1,79 @@
|
||||
use jni::JNIEnv;
|
||||
use jni::objects::{JClass};
|
||||
use jni::sys::jstring;
|
||||
use std::thread;
|
||||
use std::sync::Once;
|
||||
use jni::objects::JString;
|
||||
use crate::{run_server, stop_server};
|
||||
use std::os::raw::c_char;
|
||||
|
||||
#[link(name = "c_code", kind = "static")]
|
||||
unsafe extern "C" {
|
||||
pub fn android_log(tag: *const c_char, message: *const c_char);
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! log_to_logcat {
|
||||
($tag:expr, $($arg:tt)*) => {
|
||||
let log_message = format!($($arg)*);
|
||||
|
||||
let _ = std::panic::catch_unwind(|| {
|
||||
let tag = std::ffi::CString::new($tag).unwrap();
|
||||
let message = std::ffi::CString::new(log_message).unwrap();
|
||||
unsafe {
|
||||
crate::android::android_log(tag.as_ptr(), message.as_ptr());
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
static ANDROID_INIT: Once = Once::new();
|
||||
|
||||
// Install a panic hook once so Rust panics surface in logcat instead of being
|
||||
// silently swallowed at the JNI boundary.
|
||||
fn android_init() {
|
||||
ANDROID_INIT.call_once(|| {
|
||||
std::panic::set_hook(Box::new(|info| {
|
||||
log_to_logcat!("ew", "PANIC: {}", info);
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_startServer<'local>(
|
||||
mut env: JNIEnv<'local>,
|
||||
_class: JClass<'local>,
|
||||
config: JString<'local>,
|
||||
) -> jstring {
|
||||
android_init();
|
||||
|
||||
let config: String = env.get_string(&config).unwrap().into();
|
||||
crate::runtime::apply_config_json(&config);
|
||||
|
||||
let output = env.new_string(String::from("Azunyannnn~")).unwrap();
|
||||
thread::spawn(|| {
|
||||
run_server(true).unwrap();
|
||||
});
|
||||
log_to_logcat!("ew", "running");
|
||||
output.into_raw()
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_stopServer<'local>(env: JNIEnv<'local>, _class: JClass<'local>) -> jstring {
|
||||
android_init();
|
||||
stop_server();
|
||||
let output = env.new_string(String::from("I like Yui!")).unwrap();
|
||||
output.into_raw()
|
||||
}
|
||||
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_updateConfig<'local>(
|
||||
mut env: JNIEnv<'local>,
|
||||
_class: JClass<'local>,
|
||||
config: JString<'local>,
|
||||
) {
|
||||
android_init();
|
||||
let config: String = env.get_string(&config).unwrap().into();
|
||||
crate::runtime::apply_config_json(&config);
|
||||
}
|
||||
4
src/database.rs
Normal file
4
src/database.rs
Normal file
@@ -0,0 +1,4 @@
|
||||
pub mod gree;
|
||||
pub mod custom_song;
|
||||
pub mod custom_card;
|
||||
pub mod permissions;
|
||||
555
src/database/custom_card.rs
Normal file
555
src/database/custom_card.rs
Normal file
@@ -0,0 +1,555 @@
|
||||
use lazy_static::lazy_static;
|
||||
use rusqlite::params;
|
||||
use jzon::{array, JsonValue};
|
||||
|
||||
use crate::sql::SQLite;
|
||||
|
||||
lazy_static! {
|
||||
static ref DATABASE: SQLite = SQLite::new("custom_cards.db", setup_tables);
|
||||
}
|
||||
|
||||
// master_card_id == illust_prefix * 10000 + seq, and illust_id is derived from
|
||||
// the same pair as {prefix:05}_{seq:04}_{00|01}. Official cards are 8-digit
|
||||
// (prefix 1001-4014), the baked SIF1 import owns prefixes 10000-14999 (rows in
|
||||
// client masterdata), so runtime uploads start at prefix 15000. seq 0 never
|
||||
// exists - official illust ids start at 0001 - so an id landing on a prefix
|
||||
// boundary is skipped, not issued
|
||||
pub const FIRST_ILLUST_PREFIX: i64 = 15000;
|
||||
pub const FIRST_CARD_ID: i64 = FIRST_ILLUST_PREFIX * 10000 + 1;
|
||||
pub const LAST_CARD_ID: i64 = 999_999_999;
|
||||
|
||||
// Official characters are 1001-4014, the SIF1 import took 5001-5172 and
|
||||
// 6001-6009 - client masterdata tops out at 6009, so runtime characters start
|
||||
// at 7001. The ceiling keeps the id 5-digit (sign_{0:D5} asset naming) and
|
||||
// below the 99999 sentinel SDCharacter substitutes for OTHER-category
|
||||
// characters
|
||||
pub const FIRST_CHARACTER_ID: i64 = 7001;
|
||||
pub const LAST_CHARACTER_ID: i64 = 99_998;
|
||||
|
||||
// Cards and characters are one JSON blob each, in the exact shape
|
||||
// /api/custom_card/list serves - except `published`/`obtainable`/`rarity`,
|
||||
// which live in their own columns (the draw pool and the catalog filter query
|
||||
// them) and are injected into the served object where the wire wants them
|
||||
fn setup_tables(conn: &rusqlite::Connection) {
|
||||
conn.execute_batch("
|
||||
CREATE TABLE IF NOT EXISTS cards (
|
||||
master_card_id BIGINT NOT NULL PRIMARY KEY,
|
||||
master_character_id BIGINT NOT NULL,
|
||||
owner_id BIGINT NOT NULL,
|
||||
card TEXT NOT NULL,
|
||||
rarity INT NOT NULL DEFAULT 1,
|
||||
published INT NOT NULL DEFAULT 0,
|
||||
obtainable INT NOT NULL DEFAULT 0
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS characters (
|
||||
master_character_id BIGINT NOT NULL PRIMARY KEY,
|
||||
owner_id BIGINT NOT NULL,
|
||||
character TEXT NOT NULL
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS revision (
|
||||
id INT NOT NULL PRIMARY KEY,
|
||||
revision BIGINT NOT NULL,
|
||||
last_card_id BIGINT NOT NULL,
|
||||
last_character_id BIGINT NOT NULL
|
||||
);
|
||||
").unwrap();
|
||||
}
|
||||
|
||||
pub fn get_revision() -> i64 {
|
||||
DATABASE.lock_and_select("SELECT revision FROM revision WHERE id=1", params!()).unwrap_or_default().parse::<i64>().unwrap_or(0)
|
||||
}
|
||||
|
||||
// Bumped on every create/update/delete/publish/obtainable change so the client
|
||||
// can tell its cached catalog is stale
|
||||
pub fn bump_revision() {
|
||||
DATABASE.lock_and_exec("INSERT INTO revision (id, revision, last_card_id, last_character_id) VALUES (1, 1, 0, 0) ON CONFLICT(id) DO UPDATE SET revision=revision+1", params!());
|
||||
}
|
||||
|
||||
// Ids are never reused after a delete: a client that cached a dead id can't
|
||||
// confuse it with a later upload, and a player's stored card row for a deleted
|
||||
// card can't silently become a different card. last_card_id is the high-water
|
||||
// mark and only ever rises, so MAX() over the live rows is a floor, not the
|
||||
// answer
|
||||
pub fn next_card_id() -> i64 {
|
||||
let issued = DATABASE.lock_and_select("SELECT last_card_id FROM revision WHERE id=1", params!()).unwrap_or_default().parse::<i64>().unwrap_or(0);
|
||||
let max = DATABASE.lock_and_select("SELECT MAX(master_card_id) FROM cards", params!()).unwrap_or_default().parse::<i64>().unwrap_or(0);
|
||||
let mut rv = std::cmp::max(std::cmp::max(issued, max), FIRST_CARD_ID - 1) + 1;
|
||||
// seq 0 doesn't exist in the illust naming scheme
|
||||
if rv % 10000 == 0 {
|
||||
rv += 1;
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
pub fn next_character_id() -> i64 {
|
||||
let issued = DATABASE.lock_and_select("SELECT last_character_id FROM revision WHERE id=1", params!()).unwrap_or_default().parse::<i64>().unwrap_or(0);
|
||||
let max = DATABASE.lock_and_select("SELECT MAX(master_character_id) FROM characters", params!()).unwrap_or_default().parse::<i64>().unwrap_or(0);
|
||||
std::cmp::max(std::cmp::max(issued, max), FIRST_CHARACTER_ID - 1) + 1
|
||||
}
|
||||
|
||||
pub fn insert_card(master_card_id: i64, master_character_id: i64, owner_id: i64, card: &JsonValue, published: bool, obtainable: bool) {
|
||||
DATABASE.lock_and_exec(
|
||||
"INSERT INTO cards (master_card_id, master_character_id, owner_id, card, rarity, published, obtainable) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)",
|
||||
params!(master_card_id, master_character_id, owner_id, jzon::stringify(card.clone()), card["rarity"].as_i64().unwrap_or(1), published as i64, obtainable as i64)
|
||||
);
|
||||
DATABASE.lock_and_exec("INSERT INTO revision (id, revision, last_card_id, last_character_id) VALUES (1, 0, ?1, 0) ON CONFLICT(id) DO UPDATE SET last_card_id=?1", params!(master_card_id));
|
||||
}
|
||||
|
||||
pub fn insert_character(master_character_id: i64, owner_id: i64, character: &JsonValue) {
|
||||
DATABASE.lock_and_exec(
|
||||
"INSERT INTO characters (master_character_id, owner_id, character) VALUES (?1, ?2, ?3)",
|
||||
params!(master_character_id, owner_id, jzon::stringify(character.clone()))
|
||||
);
|
||||
DATABASE.lock_and_exec("INSERT INTO revision (id, revision, last_card_id, last_character_id) VALUES (1, 0, 0, ?1) ON CONFLICT(id) DO UPDATE SET last_character_id=?1", params!(master_character_id));
|
||||
}
|
||||
|
||||
// The catalog blob only. The owner and the published/obtainable flags live in
|
||||
// their own columns and are untouched here; rarity tracks the blob
|
||||
pub fn update_card(master_card_id: i64, card: &JsonValue) {
|
||||
DATABASE.lock_and_exec("UPDATE cards SET card=?1, rarity=?2 WHERE master_card_id=?3", params!(jzon::stringify(card.clone()), card["rarity"].as_i64().unwrap_or(1), master_card_id));
|
||||
}
|
||||
|
||||
pub fn update_character(master_character_id: i64, character: &JsonValue) {
|
||||
DATABASE.lock_and_exec("UPDATE characters SET character=?1 WHERE master_character_id=?2", params!(jzon::stringify(character.clone()), master_character_id));
|
||||
}
|
||||
|
||||
pub fn delete_card(master_card_id: i64) {
|
||||
DATABASE.lock_and_exec("DELETE FROM cards WHERE master_card_id=?1", params!(master_card_id));
|
||||
}
|
||||
|
||||
pub fn delete_character(master_character_id: i64) {
|
||||
DATABASE.lock_and_exec("DELETE FROM characters WHERE master_character_id=?1", params!(master_character_id));
|
||||
}
|
||||
|
||||
// The stored blob with the column-backed wire field injected
|
||||
fn card_with_flags(mut card: JsonValue) -> JsonValue {
|
||||
let id = card["master_card_id"].as_i64().unwrap_or(0);
|
||||
card["obtainable"] = is_obtainable(id).into();
|
||||
card
|
||||
}
|
||||
|
||||
pub fn get_card(master_card_id: i64) -> Option<JsonValue> {
|
||||
let card = DATABASE.lock_and_select("SELECT card FROM cards WHERE master_card_id=?1", params!(master_card_id)).ok()?;
|
||||
Some(card_with_flags(jzon::parse(&card).ok()?))
|
||||
}
|
||||
|
||||
pub fn get_character(master_character_id: i64) -> Option<JsonValue> {
|
||||
let character = DATABASE.lock_and_select("SELECT character FROM characters WHERE master_character_id=?1", params!(master_character_id)).ok()?;
|
||||
jzon::parse(&character).ok()
|
||||
}
|
||||
|
||||
pub fn get_card_owner(master_card_id: i64) -> Option<i64> {
|
||||
DATABASE.lock_and_select("SELECT owner_id FROM cards WHERE master_card_id=?1", params!(master_card_id)).ok()?.parse::<i64>().ok()
|
||||
}
|
||||
|
||||
pub fn get_character_owner(master_character_id: i64) -> Option<i64> {
|
||||
DATABASE.lock_and_select("SELECT owner_id FROM characters WHERE master_character_id=?1", params!(master_character_id)).ok()?.parse::<i64>().ok()
|
||||
}
|
||||
|
||||
// The character a runtime card belongs to, straight out of its own column.
|
||||
// guest::proxy_card_id resolves an unviewable card through this, so it stays a
|
||||
// plain lookup and never a decode of the blob
|
||||
pub fn character_of(master_card_id: i64) -> Option<i64> {
|
||||
DATABASE.lock_and_select("SELECT master_character_id FROM cards WHERE master_card_id=?1", params!(master_card_id)).ok()?.parse::<i64>().ok()
|
||||
}
|
||||
|
||||
pub fn is_published(master_card_id: i64) -> bool {
|
||||
DATABASE.lock_and_select("SELECT published FROM cards WHERE master_card_id=?1", params!(master_card_id)).unwrap_or_default() == "1"
|
||||
}
|
||||
|
||||
pub fn set_published(master_card_id: i64, published: bool) {
|
||||
DATABASE.lock_and_exec("UPDATE cards SET published=?1 WHERE master_card_id=?2", params!(published as i64, master_card_id));
|
||||
}
|
||||
|
||||
pub fn is_obtainable(master_card_id: i64) -> bool {
|
||||
DATABASE.lock_and_select("SELECT obtainable FROM cards WHERE master_card_id=?1", params!(master_card_id)).unwrap_or_default() == "1"
|
||||
}
|
||||
|
||||
pub fn set_obtainable(master_card_id: i64, obtainable: bool) {
|
||||
DATABASE.lock_and_exec("UPDATE cards SET obtainable=?1 WHERE master_card_id=?2", params!(obtainable as i64, master_card_id));
|
||||
}
|
||||
|
||||
pub fn has_character(master_character_id: i64) -> bool {
|
||||
DATABASE.lock_and_select("SELECT master_character_id FROM characters WHERE master_character_id=?1", params!(master_character_id)).is_ok()
|
||||
}
|
||||
|
||||
pub fn card_count_for_owner(owner_id: i64) -> i64 {
|
||||
DATABASE.lock_and_select_type::<i64>("SELECT COUNT(*) FROM cards WHERE owner_id=?1", params!(owner_id)).unwrap_or(0)
|
||||
}
|
||||
|
||||
// How many cards still point at this character. A referenced character can't
|
||||
// be deleted
|
||||
pub fn cards_using_character(master_character_id: i64) -> i64 {
|
||||
DATABASE.lock_and_select_type::<i64>("SELECT COUNT(*) FROM cards WHERE master_character_id=?1", params!(master_character_id)).unwrap_or(0)
|
||||
}
|
||||
|
||||
// A custom character is publicly visible when a published card references it -
|
||||
// that's also what lets another uploader build a card on it
|
||||
pub fn character_publicly_visible(master_character_id: i64) -> bool {
|
||||
DATABASE.lock_and_select_type::<i64>(
|
||||
"SELECT COUNT(*) FROM cards WHERE master_character_id=?1 AND published=1",
|
||||
params!(master_character_id)
|
||||
).unwrap_or(0) > 0
|
||||
}
|
||||
|
||||
fn parse_blobs(rows: JsonValue) -> JsonValue {
|
||||
let mut rv = array![];
|
||||
for data in rows.members() {
|
||||
if let Ok(parsed) = jzon::parse(&data.to_string()) {
|
||||
rv.push(parsed).unwrap();
|
||||
}
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// The card catalog this user is served: every published card, their own
|
||||
// drafts, and any card their game account already owns (`owned` - so an
|
||||
// unpublish never leaves a player holding an id their client can't resolve)
|
||||
pub fn get_cards_for_user(user_id: i64, owned: &[i64]) -> JsonValue {
|
||||
let rows = parse_blobs(DATABASE.lock_and_select_all(
|
||||
"SELECT card FROM cards WHERE published=1 OR owner_id=?1 ORDER BY master_card_id",
|
||||
params!(user_id)
|
||||
).unwrap_or(array![]));
|
||||
let mut rv = array![];
|
||||
let mut ids: Vec<i64> = Vec::new();
|
||||
for card in rows.members() {
|
||||
ids.push(card["master_card_id"].as_i64().unwrap_or(0));
|
||||
rv.push(card_with_flags(card.clone())).unwrap();
|
||||
}
|
||||
for id in owned {
|
||||
if ids.contains(id) {
|
||||
continue;
|
||||
}
|
||||
if let Some(card) = get_card(*id) {
|
||||
rv.push(card).unwrap();
|
||||
}
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// The character catalog rides along with the cards: a custom character is
|
||||
// included exactly when a served card references it, or the requester owns it
|
||||
// (so a draft character never leaks, and the catalog is referentially closed -
|
||||
// a served card can never name a master_character_id the same response failed
|
||||
// to deliver)
|
||||
pub fn get_characters_for_cards(user_id: i64, cards: &JsonValue) -> JsonValue {
|
||||
let mut ids: Vec<i64> = Vec::new();
|
||||
for card in cards.members() {
|
||||
let id = card["master_character_id"].as_i64().unwrap_or(0);
|
||||
if (FIRST_CHARACTER_ID..=LAST_CHARACTER_ID).contains(&id) && !ids.contains(&id) {
|
||||
ids.push(id);
|
||||
}
|
||||
}
|
||||
let own = DATABASE.lock_and_select_all("SELECT master_character_id FROM characters WHERE owner_id=?1 ORDER BY master_character_id", params!(user_id)).unwrap_or(array![]);
|
||||
for id in own.members() {
|
||||
let id = id.as_i64().unwrap_or(0);
|
||||
if !ids.contains(&id) {
|
||||
ids.push(id);
|
||||
}
|
||||
}
|
||||
ids.sort();
|
||||
let mut rv = array![];
|
||||
for id in ids {
|
||||
if let Some(character) = get_character(id) {
|
||||
rv.push(character).unwrap();
|
||||
}
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// The custom characters this user may build a card on (mirrors
|
||||
// validate_character_ref): their own, plus any that is publicly visible
|
||||
// through a published card. Feeds the webui's character picker
|
||||
pub fn get_selectable_characters(user_id: i64) -> JsonValue {
|
||||
parse_blobs(DATABASE.lock_and_select_all("
|
||||
SELECT character FROM characters
|
||||
WHERE owner_id=?1 OR master_character_id IN (SELECT master_character_id FROM cards WHERE published=1)
|
||||
ORDER BY master_character_id", params!(user_id)).unwrap_or(array![]))
|
||||
}
|
||||
|
||||
// Card blobs plus the flag columns, for the webui manage view
|
||||
pub fn get_cards_by_owner(owner_id: i64) -> JsonValue {
|
||||
let rows = parse_blobs(DATABASE.lock_and_select_all("SELECT card FROM cards WHERE owner_id=?1 ORDER BY master_card_id", params!(owner_id)).unwrap_or(array![]));
|
||||
let mut rv = array![];
|
||||
for card in rows.members() {
|
||||
let mut card = card_with_flags(card.clone());
|
||||
card["published"] = is_published(card["master_card_id"].as_i64().unwrap_or(0)).into();
|
||||
rv.push(card).unwrap();
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
pub fn get_characters_by_owner(owner_id: i64) -> JsonValue {
|
||||
parse_blobs(DATABASE.lock_and_select_all("SELECT character FROM characters WHERE owner_id=?1 ORDER BY master_character_id", params!(owner_id)).unwrap_or(array![]))
|
||||
}
|
||||
|
||||
// The webui card browser: every published card, plus the owner id so the page
|
||||
// can label the uploader
|
||||
pub fn get_browse_cards() -> JsonValue {
|
||||
let rows = parse_blobs(DATABASE.lock_and_select_all("SELECT card FROM cards WHERE published=1 ORDER BY master_card_id", params!()).unwrap_or(array![]));
|
||||
let mut rv = array![];
|
||||
for card in rows.members() {
|
||||
let mut card = card_with_flags(card.clone());
|
||||
card["owner_id"] = get_card_owner(card["master_card_id"].as_i64().unwrap_or(0)).unwrap_or(0).into();
|
||||
rv.push(card).unwrap();
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// Which of these candidate ids no longer exist. Only the runtime band is ever
|
||||
// considered, and ids are never reused, so official (or imported) cards can't
|
||||
// come back from this and a wipe is final. A card that's merely unpublished
|
||||
// still has its row - only genuinely deleted ids are returned
|
||||
pub fn dead_card_ids(candidates: &JsonValue) -> JsonValue {
|
||||
let mut ids: Vec<i64> = Vec::new();
|
||||
for id in candidates.members() {
|
||||
let Some(id) = id.as_i64() else { continue; };
|
||||
if (FIRST_CARD_ID..=LAST_CARD_ID).contains(&id) && !ids.contains(&id) {
|
||||
ids.push(id);
|
||||
}
|
||||
}
|
||||
if ids.is_empty() {
|
||||
return array![];
|
||||
}
|
||||
let list = ids.iter().map(|id| id.to_string()).collect::<Vec<_>>().join(",");
|
||||
let alive = DATABASE.lock_and_select_all(&format!("SELECT master_card_id FROM cards WHERE master_card_id IN ({})", list), params!()).unwrap_or(array![]);
|
||||
let mut rv = array![];
|
||||
for id in ids {
|
||||
if !alive.contains(id) {
|
||||
rv.push(id).unwrap();
|
||||
}
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// The published + obtainable pool the custom gacha banner draws from, per
|
||||
// rarity
|
||||
pub fn obtainable_card_ids(rarity: i64) -> Vec<i64> {
|
||||
let rows = DATABASE.lock_and_select_all(
|
||||
"SELECT master_card_id FROM cards WHERE published=1 AND obtainable=1 AND rarity=?1 ORDER BY master_card_id",
|
||||
params!(rarity)
|
||||
).unwrap_or(array![]);
|
||||
rows.members().filter_map(|id| id.as_i64()).collect()
|
||||
}
|
||||
|
||||
// Resolve a content-addressed art md5 to the file under custom_cards/ that
|
||||
// currently holds those bytes: card art lives at {card_id}/{kind}_{variant}.png,
|
||||
// character art at characters/{character_id}/{kind}.png. Art is stored per
|
||||
// entity (not a shared md5 store) and the catalog md5 always tracks the
|
||||
// on-disk bytes - so this is the index the /custom_card/data/{md5} route
|
||||
// serves from, and it self-heals: a replaced file gets a new md5 and the old
|
||||
// one simply stops resolving
|
||||
// Resolve a voiceline md5 to its ogg under custom_cards/. Voicelines live in
|
||||
// the character blob's `voice` array and on disk under the character's own
|
||||
// voice/ subdirectory, so they share the art routes' self-healing property
|
||||
pub fn find_voice_by_md5(md5: &str) -> Option<String> {
|
||||
let blob = DATABASE.lock_and_select("SELECT character FROM characters WHERE character LIKE ?1", params!(format!("%{}%", md5))).ok()?;
|
||||
let character = jzon::parse(&blob).ok()?;
|
||||
let id = character["master_character_id"].as_i64()?;
|
||||
for line in character["voice"].members() {
|
||||
if line["md5"].as_str() == Some(md5) {
|
||||
return Some(format!("characters/{}/voice/{}.ogg", id, md5));
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
pub fn find_asset_by_md5(md5: &str) -> Option<String> {
|
||||
let like = format!("%{}%", md5);
|
||||
if let Ok(blob) = DATABASE.lock_and_select("SELECT card FROM cards WHERE card LIKE ?1", params!(like.clone())) {
|
||||
if let Ok(card) = jzon::parse(&blob) {
|
||||
let master_card_id = card["master_card_id"].as_i64()?;
|
||||
for art in card["art"].members() {
|
||||
if art["md5"].as_str() == Some(md5) {
|
||||
return Some(format!("{}/{}_{}.png", master_card_id, art["kind"], art["variant"]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let blob = DATABASE.lock_and_select("SELECT character FROM characters WHERE character LIKE ?1", params!(like)).ok()?;
|
||||
let character = jzon::parse(&blob).ok()?;
|
||||
let id = character["master_character_id"].as_i64()?;
|
||||
for art in character["art"].members() {
|
||||
if art["md5"].as_str() == Some(md5) {
|
||||
return Some(format!("characters/{}/{}.png", id, art["kind"]));
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use jzon::object;
|
||||
|
||||
fn card_blob(id: i64, rarity: i64) -> JsonValue {
|
||||
object!{
|
||||
"master_card_id": id,
|
||||
"master_character_id": 1001,
|
||||
"rarity": rarity,
|
||||
"art": [{ "kind": "c", "variant": "00", "md5": format!("{:032x}", id), "size": 1 }]
|
||||
}
|
||||
}
|
||||
|
||||
fn wipe(owner: i64) {
|
||||
for card in get_cards_by_owner(owner).members() {
|
||||
delete_card(card["master_card_id"].as_i64().unwrap());
|
||||
}
|
||||
for character in get_characters_by_owner(owner).members() {
|
||||
delete_character(character["master_character_id"].as_i64().unwrap());
|
||||
}
|
||||
}
|
||||
|
||||
// Ids are sequential from FIRST_CARD_ID, never reused after a delete, and
|
||||
// never land on a seq-0 prefix boundary
|
||||
#[test]
|
||||
fn ids_are_sequential_and_never_reused() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(3001);
|
||||
|
||||
let first = next_card_id();
|
||||
assert!(first >= FIRST_CARD_ID);
|
||||
assert_ne!(first % 10000, 0);
|
||||
insert_card(first, 1001, 3001, &card_blob(first, 1), false, false);
|
||||
let second = next_card_id();
|
||||
assert_eq!(second, first + 1);
|
||||
insert_card(second, 1001, 3001, &card_blob(second, 1), false, false);
|
||||
delete_card(second);
|
||||
assert_eq!(get_card(second), None);
|
||||
// The high-water mark survives the delete, so the id is retired
|
||||
assert_eq!(next_card_id(), second + 1);
|
||||
|
||||
let character = next_character_id();
|
||||
assert!(character >= FIRST_CHARACTER_ID);
|
||||
insert_character(character, 3001, &object!{ "master_character_id": character });
|
||||
assert_eq!(next_character_id(), character + 1);
|
||||
delete_character(character);
|
||||
assert_eq!(next_character_id(), character + 1);
|
||||
|
||||
wipe(3001);
|
||||
assert!(next_card_id() > second);
|
||||
}
|
||||
|
||||
// Published cards go to everyone, drafts only to their owner, a game
|
||||
// account that owns a card keeps seeing it even unpublished, and a
|
||||
// character rides along with any card the viewer is served
|
||||
#[test]
|
||||
fn catalog_filters_per_user() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(3003);
|
||||
wipe(3004);
|
||||
|
||||
let character = next_character_id();
|
||||
insert_character(character, 3003, &object!{ "master_character_id": character });
|
||||
let published = next_card_id();
|
||||
let mut blob = card_blob(published, 3);
|
||||
blob["master_character_id"] = character.into();
|
||||
insert_card(published, character, 3003, &blob, true, true);
|
||||
let draft = next_card_id();
|
||||
insert_card(draft, character, 3003, &card_blob(draft, 1), false, false);
|
||||
|
||||
let owner_view = get_cards_for_user(3003, &[]);
|
||||
assert_eq!(owner_view.len(), 2);
|
||||
let other_view = get_cards_for_user(3004, &[]);
|
||||
assert_eq!(other_view.len(), 1);
|
||||
assert_eq!(other_view[0]["master_card_id"].as_i64(), Some(published));
|
||||
// The wire `obtainable` field comes from the column
|
||||
assert_eq!(other_view[0]["obtainable"].as_bool(), Some(true));
|
||||
|
||||
// A player who owns the draft in game still resolves it
|
||||
let holder_view = get_cards_for_user(3004, &[draft]);
|
||||
assert_eq!(holder_view.len(), 2);
|
||||
|
||||
// Unpublishing removes it from strangers, not from holders
|
||||
set_published(published, false);
|
||||
assert!(get_cards_for_user(3004, &[]).is_empty());
|
||||
assert_eq!(get_cards_for_user(3004, &[published]).len(), 1);
|
||||
set_published(published, true);
|
||||
|
||||
// Characters follow the served cards; a stranger with no visible card
|
||||
// on the character doesn't get it
|
||||
let characters = get_characters_for_cards(3004, &get_cards_for_user(3004, &[]));
|
||||
assert_eq!(characters.len(), 1);
|
||||
assert_eq!(characters[0]["master_character_id"].as_i64(), Some(character));
|
||||
set_published(published, false);
|
||||
assert!(get_characters_for_cards(3004, &get_cards_for_user(3004, &[])).is_empty());
|
||||
// The owner always sees their own character
|
||||
assert_eq!(get_characters_for_cards(3003, &get_cards_for_user(3003, &[])).len(), 1);
|
||||
set_published(published, true);
|
||||
|
||||
assert_eq!(character_of(published), Some(character));
|
||||
assert_eq!(cards_using_character(character), 2);
|
||||
assert!(character_publicly_visible(character));
|
||||
assert_eq!(card_count_for_owner(3003), 2);
|
||||
|
||||
wipe(3003);
|
||||
wipe(3004);
|
||||
}
|
||||
|
||||
// The draw pool is exactly the published + obtainable cards of the rarity
|
||||
#[test]
|
||||
fn obtainable_pool_by_rarity() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(3005);
|
||||
|
||||
let r1 = next_card_id();
|
||||
insert_card(r1, 1001, 3005, &card_blob(r1, 1), true, true);
|
||||
let r3 = next_card_id();
|
||||
insert_card(r3, 1001, 3005, &card_blob(r3, 3), true, true);
|
||||
let unpublished = next_card_id();
|
||||
insert_card(unpublished, 1001, 3005, &card_blob(unpublished, 1), false, true);
|
||||
let unobtainable = next_card_id();
|
||||
insert_card(unobtainable, 1001, 3005, &card_blob(unobtainable, 1), true, false);
|
||||
|
||||
assert_eq!(obtainable_card_ids(1), vec![r1]);
|
||||
assert_eq!(obtainable_card_ids(3), vec![r3]);
|
||||
assert!(obtainable_card_ids(2).is_empty());
|
||||
set_obtainable(unobtainable, true);
|
||||
assert_eq!(obtainable_card_ids(1), vec![r1, unobtainable]);
|
||||
|
||||
wipe(3005);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn md5_resolves_to_the_file_holding_the_bytes() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(3007);
|
||||
|
||||
let id = next_card_id();
|
||||
insert_card(id, 1001, 3007, &card_blob(id, 1), true, false);
|
||||
assert_eq!(find_asset_by_md5(&format!("{:032x}", id)), Some(format!("{}/c_00.png", id)));
|
||||
assert_eq!(find_asset_by_md5("00000000000000000000000000000000"), None);
|
||||
|
||||
let character = next_character_id();
|
||||
insert_character(character, 3007, &object!{
|
||||
"master_character_id": character,
|
||||
"art": [{ "kind": "icon", "md5": "aabbccddeeff00112233445566778899", "size": 1 }]
|
||||
});
|
||||
assert_eq!(
|
||||
find_asset_by_md5("aabbccddeeff00112233445566778899"),
|
||||
Some(format!("characters/{}/icon.png", character))
|
||||
);
|
||||
|
||||
wipe(3007);
|
||||
}
|
||||
|
||||
// Deleted ids come back from dead_card_ids; unpublished, imported and
|
||||
// official ids never do
|
||||
#[test]
|
||||
fn dead_ids_are_deleted_ids_only() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(3008);
|
||||
|
||||
let alive = next_card_id();
|
||||
insert_card(alive, 1001, 3008, &card_blob(alive, 1), false, false);
|
||||
let dead = next_card_id();
|
||||
insert_card(dead, 1001, 3008, &card_blob(dead, 1), true, false);
|
||||
delete_card(dead);
|
||||
|
||||
let dead_ids = dead_card_ids(&array![alive, dead, 10010001, 100010001, dead]);
|
||||
assert_eq!(dead_ids.len(), 1);
|
||||
assert_eq!(dead_ids[0].as_i64(), Some(dead));
|
||||
|
||||
wipe(3008);
|
||||
}
|
||||
}
|
||||
334
src/database/custom_song.rs
Normal file
334
src/database/custom_song.rs
Normal file
@@ -0,0 +1,334 @@
|
||||
use lazy_static::lazy_static;
|
||||
use rusqlite::params;
|
||||
use jzon::{array, JsonValue};
|
||||
|
||||
use crate::sql::SQLite;
|
||||
|
||||
lazy_static! {
|
||||
static ref DATABASE: SQLite = SQLite::new("custom_songs.db", setup_tables);
|
||||
}
|
||||
|
||||
// Song visibility: "public" (everyone), "private" (owner only) or "shared"
|
||||
// (owner plus the user ids in shared_users)
|
||||
pub const VISIBILITIES: &[&str] = &["public", "private", "shared"];
|
||||
|
||||
// master_group_id must be a real GroupMst id whose category matches the song's
|
||||
// band_category, or the client's music-library group filter throws
|
||||
// KeyNotFoundException (0 is never a valid GroupMst id). Custom songs go into
|
||||
// each band's misc / "その他" catch-all group so they don't masquerade as an
|
||||
// official sub-unit. Bands with no misc group (and OTHER/unknown) fall back to
|
||||
// 9999, the OTHER catch-all
|
||||
pub fn band_group_id(band_category: &str) -> i64 {
|
||||
match band_category {
|
||||
"MUSE" => 199,
|
||||
"AQOURS" => 299,
|
||||
"NIJIGAKU" => 399,
|
||||
"LIELLA" => 499,
|
||||
"HASUNOSORA" => 599,
|
||||
_ => 9999
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_tables(conn: &rusqlite::Connection) {
|
||||
conn.execute_batch("
|
||||
CREATE TABLE IF NOT EXISTS songs (
|
||||
music_id BIGINT NOT NULL PRIMARY KEY,
|
||||
owner_id BIGINT NOT NULL,
|
||||
song TEXT NOT NULL,
|
||||
visibility TEXT NOT NULL DEFAULT 'public',
|
||||
downloads_disabled INT NOT NULL DEFAULT 0
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS shared_users (
|
||||
music_id BIGINT NOT NULL,
|
||||
user_id BIGINT NOT NULL,
|
||||
PRIMARY KEY (music_id, user_id)
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS revision (
|
||||
id INT NOT NULL PRIMARY KEY,
|
||||
revision BIGINT NOT NULL,
|
||||
last_music_id BIGINT NOT NULL
|
||||
);
|
||||
").unwrap();
|
||||
// Upgrade pre-visibility databases. Existing songs stay public
|
||||
if conn.prepare("SELECT visibility FROM songs LIMIT 1;").is_err() {
|
||||
println!("Upgrading custom song table");
|
||||
conn.execute("ALTER TABLE songs ADD COLUMN visibility TEXT NOT NULL DEFAULT 'public';", []).unwrap();
|
||||
}
|
||||
// Upgrade pre-download-toggle databases. Existing songs stay downloadable
|
||||
if conn.prepare("SELECT downloads_disabled FROM songs LIMIT 1;").is_err() {
|
||||
println!("Upgrading custom song table (downloads)");
|
||||
conn.execute("ALTER TABLE songs ADD COLUMN downloads_disabled INT NOT NULL DEFAULT 0;", []).unwrap();
|
||||
}
|
||||
// Rewrite blobs that stored the old invalid master_group_id 0 to the band's
|
||||
// real GroupMst id (the client's group filter crashes on 0). The blob is
|
||||
// served verbatim, so this must be persisted, not just applied at read time
|
||||
let rows: Vec<(i64, String)> = {
|
||||
let mut stmt = conn.prepare("SELECT music_id, song FROM songs").unwrap();
|
||||
let mapped = stmt.query_map([], |row| Ok((row.get::<_, i64>(0)?, row.get::<_, String>(1)?))).unwrap();
|
||||
mapped.filter_map(|r| r.ok()).collect()
|
||||
};
|
||||
let mut fixed = 0;
|
||||
for (music_id, blob) in rows {
|
||||
let mut song = jzon::parse(&blob).unwrap();
|
||||
if song["master_group_id"].as_i64() == Some(0) {
|
||||
song["master_group_id"] = band_group_id(&song["band_category"].to_string()).into();
|
||||
conn.execute("UPDATE songs SET song=?1 WHERE music_id=?2", params!(jzon::stringify(song), music_id)).unwrap();
|
||||
fixed += 1;
|
||||
}
|
||||
}
|
||||
if fixed > 0 {
|
||||
println!("Upgrading custom song table (master_group_id): {} row(s)", fixed);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_revision() -> i64 {
|
||||
DATABASE.lock_and_select("SELECT revision FROM revision WHERE id=1", params!()).unwrap_or_default().parse::<i64>().unwrap_or(0)
|
||||
}
|
||||
|
||||
// Bumped on every upload/update/delete/visibility change so the client can invalidate its cache
|
||||
pub fn bump_revision() {
|
||||
DATABASE.lock_and_exec("INSERT INTO revision (id, revision, last_music_id) VALUES (1, 1, 0) ON CONFLICT(id) DO UPDATE SET revision=revision+1", params!());
|
||||
}
|
||||
|
||||
// music_ids are assigned sequentially starting at 10000. live_id == music_id.
|
||||
// The official music mst occupies 4-digit ids up to 9032 (School Idol Musical
|
||||
// + 異次元フェス) along with bgm 310090xx/320090xx, so the custom range gets
|
||||
// the 5-digit space to itself (10000 -> bgm 31010000/32010000). Ids are never
|
||||
// reused after a delete, so a client's cached copy of a dead id can't get
|
||||
// confused with a new upload. Stock live ids (master_live_id) are 7-digit
|
||||
// (>= 1_000_000), so the custom range stops below them - a stock clear must
|
||||
// never be mistaken for a deleted custom song
|
||||
pub const FIRST_MUSIC_ID: i64 = 10000;
|
||||
pub const LAST_MUSIC_ID: i64 = 999_999;
|
||||
|
||||
pub fn next_music_id() -> i64 {
|
||||
let issued = DATABASE.lock_and_select("SELECT last_music_id FROM revision WHERE id=1", params!()).unwrap_or_default().parse::<i64>().unwrap_or(0);
|
||||
let max = DATABASE.lock_and_select("SELECT MAX(music_id) FROM songs", params!()).unwrap_or_default().parse::<i64>().unwrap_or(0);
|
||||
std::cmp::max(std::cmp::max(issued, max), FIRST_MUSIC_ID - 1) + 1
|
||||
}
|
||||
|
||||
pub fn insert_song(music_id: i64, owner_id: i64, song: &JsonValue, visibility: &str, shared_with: &JsonValue, downloads_disabled: bool) {
|
||||
DATABASE.lock_and_exec("INSERT INTO songs (music_id, owner_id, song, visibility, downloads_disabled) VALUES (?1, ?2, ?3, ?4, ?5)", params!(music_id, owner_id, jzon::stringify(song.clone()), visibility, downloads_disabled as i64));
|
||||
DATABASE.lock_and_exec("INSERT INTO revision (id, revision, last_music_id) VALUES (1, 0, ?1) ON CONFLICT(id) DO UPDATE SET last_music_id=?1", params!(music_id));
|
||||
set_shared_users(music_id, shared_with);
|
||||
}
|
||||
|
||||
// Replace an existing song's catalog blob in place. The owner, visibility,
|
||||
// shared list and download toggle live in their own columns and are untouched
|
||||
pub fn update_song(music_id: i64, song: &JsonValue) {
|
||||
DATABASE.lock_and_exec("UPDATE songs SET song=?1 WHERE music_id=?2", params!(jzon::stringify(song.clone()), music_id));
|
||||
}
|
||||
|
||||
pub fn delete_song(music_id: i64) {
|
||||
DATABASE.lock_and_exec("DELETE FROM songs WHERE music_id=?1", params!(music_id));
|
||||
DATABASE.lock_and_exec("DELETE FROM shared_users WHERE music_id=?1", params!(music_id));
|
||||
}
|
||||
|
||||
pub fn get_song(music_id: i64) -> Option<JsonValue> {
|
||||
let song = DATABASE.lock_and_select("SELECT song FROM songs WHERE music_id=?1", params!(music_id)).ok()?;
|
||||
jzon::parse(&song).ok()
|
||||
}
|
||||
|
||||
pub fn get_song_owner(music_id: i64) -> Option<i64> {
|
||||
DATABASE.lock_and_select("SELECT owner_id FROM songs WHERE music_id=?1", params!(music_id)).ok()?.parse::<i64>().ok()
|
||||
}
|
||||
|
||||
pub fn set_visibility(music_id: i64, visibility: &str, shared_with: &JsonValue) {
|
||||
DATABASE.lock_and_exec("UPDATE songs SET visibility=?1 WHERE music_id=?2", params!(visibility, music_id));
|
||||
set_shared_users(music_id, shared_with);
|
||||
}
|
||||
|
||||
pub fn set_downloads_disabled(music_id: i64, downloads_disabled: bool) {
|
||||
DATABASE.lock_and_exec("UPDATE songs SET downloads_disabled=?1 WHERE music_id=?2", params!(downloads_disabled as i64, music_id));
|
||||
}
|
||||
|
||||
fn get_downloads_disabled(music_id: i64) -> bool {
|
||||
DATABASE.lock_and_select("SELECT downloads_disabled FROM songs WHERE music_id=?1", params!(music_id)).unwrap_or_default() == "1"
|
||||
}
|
||||
|
||||
fn set_shared_users(music_id: i64, shared_with: &JsonValue) {
|
||||
DATABASE.lock_and_exec("DELETE FROM shared_users WHERE music_id=?1", params!(music_id));
|
||||
for id in shared_with.members() {
|
||||
DATABASE.lock_and_exec("INSERT OR IGNORE INTO shared_users (music_id, user_id) VALUES (?1, ?2)", params!(music_id, id.as_i64().unwrap()));
|
||||
}
|
||||
}
|
||||
|
||||
fn get_visibility(music_id: i64) -> String {
|
||||
DATABASE.lock_and_select("SELECT visibility FROM songs WHERE music_id=?1", params!(music_id)).unwrap_or(String::from("public"))
|
||||
}
|
||||
|
||||
fn get_shared_users(music_id: i64) -> JsonValue {
|
||||
DATABASE.lock_and_select_all("SELECT user_id FROM shared_users WHERE music_id=?1 ORDER BY user_id", params!(music_id)).unwrap_or(array![])
|
||||
}
|
||||
|
||||
// The catalog a given user is allowed to see: public songs, their own songs,
|
||||
// and songs shared with them
|
||||
pub fn get_songs_for_user(user_id: i64) -> JsonValue {
|
||||
let songs = DATABASE.lock_and_select_all("
|
||||
SELECT song FROM songs
|
||||
WHERE visibility='public' OR owner_id=?1
|
||||
OR (visibility='shared' AND music_id IN (SELECT music_id FROM shared_users WHERE user_id=?1))
|
||||
ORDER BY music_id", params!(user_id)).unwrap_or(array![]);
|
||||
let mut rv = array![];
|
||||
for data in songs.members() {
|
||||
rv.push(jzon::parse(&data.to_string()).unwrap()).unwrap();
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// Song blobs plus the visibility fields, for the webui manage view
|
||||
pub fn get_songs_by_owner(owner_id: i64) -> JsonValue {
|
||||
let songs = DATABASE.lock_and_select_all("SELECT song FROM songs WHERE owner_id=?1 ORDER BY music_id", params!(owner_id)).unwrap_or(array![]);
|
||||
let mut rv = array![];
|
||||
for data in songs.members() {
|
||||
let mut song = jzon::parse(&data.to_string()).unwrap();
|
||||
let music_id = song["music_id"].as_i64().unwrap();
|
||||
song["visibility"] = get_visibility(music_id).into();
|
||||
song["shared_with"] = get_shared_users(music_id);
|
||||
song["downloads_disabled"] = get_downloads_disabled(music_id).into();
|
||||
rv.push(song).unwrap();
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// The webui song browser: everything the viewer is allowed to see under the
|
||||
// visibility rules, plus the fields the browser page needs. Anonymous viewers
|
||||
// (no webui session) see the public catalog only
|
||||
pub fn get_browse_songs(viewer: Option<i64>) -> JsonValue {
|
||||
let viewer = viewer.unwrap_or(0);
|
||||
let songs = DATABASE.lock_and_select_all("
|
||||
SELECT song FROM songs
|
||||
WHERE visibility='public' OR owner_id=?1
|
||||
OR (visibility='shared' AND music_id IN (SELECT music_id FROM shared_users WHERE user_id=?1))
|
||||
ORDER BY music_id", params!(viewer)).unwrap_or(array![]);
|
||||
let mut rv = array![];
|
||||
for data in songs.members() {
|
||||
let mut song = jzon::parse(&data.to_string()).unwrap();
|
||||
let music_id = song["music_id"].as_i64().unwrap();
|
||||
let owner = get_song_owner(music_id).unwrap_or(0);
|
||||
song["owner_id"] = owner.into();
|
||||
song["mine"] = (owner == viewer).into();
|
||||
song["downloads_disabled"] = get_downloads_disabled(music_id).into();
|
||||
rv.push(song).unwrap();
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// Whether this viewer may download the song's export package: they must be
|
||||
// able to SEE it (same rules as the catalog - a private song 404s rather than
|
||||
// admitting it exists), and downloads must be enabled unless they own it
|
||||
pub fn export_allowed(music_id: i64, viewer: Option<i64>) -> Result<(), &'static str> {
|
||||
let Some(owner) = get_song_owner(music_id) else {
|
||||
return Err("Song not found");
|
||||
};
|
||||
let viewer = viewer.unwrap_or(0);
|
||||
if owner == viewer {
|
||||
return Ok(());
|
||||
}
|
||||
let visible = match get_visibility(music_id).as_str() {
|
||||
"public" => true,
|
||||
"shared" => get_shared_users(music_id).contains(viewer),
|
||||
_ => false
|
||||
};
|
||||
if !visible {
|
||||
return Err("Song not found");
|
||||
}
|
||||
if get_downloads_disabled(music_id) {
|
||||
return Err("The uploader has disabled downloads for this song");
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// The display title for a PUBLIC custom song, for the clear-rate page.
|
||||
// Private/shared songs return None - their names (and existence) must not
|
||||
// leak beyond the visibility rules, so this never falls back past the
|
||||
// explicit visibility check (an absent row is None, not "public")
|
||||
pub fn public_song_title(music_id: i64, english: bool) -> Option<String> {
|
||||
if !(FIRST_MUSIC_ID..=LAST_MUSIC_ID).contains(&music_id) {
|
||||
return None;
|
||||
}
|
||||
let visibility = DATABASE.lock_and_select("SELECT visibility FROM songs WHERE music_id=?1", params!(music_id)).ok()?;
|
||||
if visibility != "public" {
|
||||
return None;
|
||||
}
|
||||
let song = get_song(music_id)?;
|
||||
let name = song["name"].as_str().unwrap_or("").to_string();
|
||||
let name_en = song["name_en"].as_str().unwrap_or("").to_string();
|
||||
Some(if english && !name_en.is_empty() { name_en } else { name })
|
||||
}
|
||||
|
||||
pub fn get_music_ids_for_user(user_id: i64) -> JsonValue {
|
||||
DATABASE.lock_and_select_all("
|
||||
SELECT music_id FROM songs
|
||||
WHERE visibility='public' OR owner_id=?1
|
||||
OR (visibility='shared' AND music_id IN (SELECT music_id FROM shared_users WHERE user_id=?1))
|
||||
ORDER BY music_id", params!(user_id)).unwrap_or(array![])
|
||||
}
|
||||
|
||||
pub fn non_public_music_ids() -> JsonValue {
|
||||
DATABASE.lock_and_select_all("SELECT music_id FROM songs WHERE visibility!='public' ORDER BY music_id", params!()).unwrap_or(array![])
|
||||
}
|
||||
|
||||
pub fn non_public_music_ids_for(user_id: i64) -> JsonValue {
|
||||
DATABASE.lock_and_select_all("
|
||||
SELECT music_id FROM songs
|
||||
WHERE visibility!='public' AND owner_id!=?1
|
||||
AND music_id NOT IN (SELECT music_id FROM shared_users WHERE user_id=?1)
|
||||
ORDER BY music_id", params!(user_id)).unwrap_or(array![])
|
||||
}
|
||||
|
||||
// Which of these candidate ids no longer exist in the catalog. Only the custom
|
||||
// range is ever considered, so official songs can't come back from this. A song
|
||||
// that's merely private/shared still has its row - only genuinely deleted ids
|
||||
// (which are never reused) are returned
|
||||
pub fn dead_music_ids(candidates: &JsonValue) -> JsonValue {
|
||||
let mut ids: Vec<i64> = Vec::new();
|
||||
for id in candidates.members() {
|
||||
let Some(id) = id.as_i64() else { continue; };
|
||||
if id >= FIRST_MUSIC_ID && id <= LAST_MUSIC_ID && !ids.contains(&id) {
|
||||
ids.push(id);
|
||||
}
|
||||
}
|
||||
if ids.is_empty() {
|
||||
return array![];
|
||||
}
|
||||
let list = ids.iter().map(|id| id.to_string()).collect::<Vec<_>>().join(",");
|
||||
let alive = DATABASE.lock_and_select_all(&format!("SELECT music_id FROM songs WHERE music_id IN ({})", list), params!()).unwrap_or(array![]);
|
||||
let mut rv = array![];
|
||||
for id in ids {
|
||||
if !alive.contains(id) {
|
||||
rv.push(id).unwrap();
|
||||
}
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// Audio files are content-addressed and may be shared between songs
|
||||
pub fn audio_in_use(md5: &str, ignored_music_id: i64) -> bool {
|
||||
DATABASE.lock_and_select("SELECT music_id FROM songs WHERE music_id!=?1 AND song LIKE ?2", params!(ignored_music_id, format!("%{}%", md5))).is_ok()
|
||||
}
|
||||
|
||||
// Resolve a content-addressed chart/jacket md5 to the per-song-id file that
|
||||
// currently holds those bytes: (music_id, relative filename under
|
||||
// custom_songs/{music_id}/). Charts and jackets live in the per-song directory
|
||||
// (not a shared md5 store), and their catalog md5 always tracks the on-disk
|
||||
// bytes - so this is the index the /custom_song/data/{md5} route serves from,
|
||||
// and it self-heals: an edited asset gets a new md5 and old md5s stop resolving.
|
||||
// Audio has its own route and is intentionally not resolved here.
|
||||
pub fn find_asset_by_md5(md5: &str) -> Option<(i64, String)> {
|
||||
let blob = DATABASE.lock_and_select("SELECT song FROM songs WHERE song LIKE ?1", params!(format!("%{}%", md5))).ok()?;
|
||||
let song = jzon::parse(&blob).ok()?;
|
||||
let music_id = song["music_id"].as_i64()?;
|
||||
if song["jacket_md5"].as_str() == Some(md5) {
|
||||
return Some((music_id, String::from("jacket.png")));
|
||||
}
|
||||
if song["jacket_blur_md5"].as_str() == Some(md5) {
|
||||
return Some((music_id, String::from("jacket_blur.png")));
|
||||
}
|
||||
for level in song["levels"].members() {
|
||||
if level["md5"].as_str() == Some(md5) {
|
||||
return Some((music_id, format!("chart_{}.json", level["level"].as_i64()?)));
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
143
src/database/gree.rs
Normal file
143
src/database/gree.rs
Normal file
@@ -0,0 +1,143 @@
|
||||
use actix_web::http::header::{HeaderMap, HeaderValue};
|
||||
use base64::{Engine as _, engine::general_purpose};
|
||||
use lazy_static::lazy_static;
|
||||
use rsa::{Pkcs1v15Sign, RsaPublicKey};
|
||||
use rusqlite::params;
|
||||
use sha1::Sha1;
|
||||
use sha1::Digest;
|
||||
use rsa::pkcs8::DecodePublicKey;
|
||||
|
||||
use crate::router::{global, userdata};
|
||||
use crate::sql::SQLite;
|
||||
|
||||
lazy_static! {
|
||||
static ref DATABASE: SQLite = SQLite::new("gree.db", setup_tables);
|
||||
}
|
||||
|
||||
pub fn setup() {
|
||||
vacuum_database();
|
||||
}
|
||||
|
||||
fn setup_tables(conn: &rusqlite::Connection) {
|
||||
conn.execute_batch("CREATE TABLE IF NOT EXISTS users (
|
||||
cert TEXT NOT NULL,
|
||||
uuid TEXT NOT NULL,
|
||||
user_id BIGINT NOT NULL PRIMARY KEY
|
||||
);").unwrap();
|
||||
}
|
||||
|
||||
pub fn update_cert(uid: i64, cert: &str) {
|
||||
if DATABASE.lock_and_select("SELECT cert FROM users WHERE user_id=?1;", params!(uid)).is_err() {
|
||||
let token = userdata::get_login_token(uid);
|
||||
if token != String::new() {
|
||||
DATABASE.lock_and_exec(
|
||||
"INSERT INTO users (cert, uuid, user_id) VALUES (?1, ?2, ?3)",
|
||||
params!(cert, token, uid)
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
DATABASE.lock_and_exec("UPDATE users SET cert=?1 WHERE user_id=?2", params!(cert, uid));
|
||||
}
|
||||
|
||||
pub fn create_acc(cert: &str) -> String {
|
||||
let uuid = global::create_token();
|
||||
let user = userdata::get_acc(&uuid);
|
||||
let user_id = user["user"]["id"].as_i64().unwrap();
|
||||
DATABASE.lock_and_exec(
|
||||
"INSERT INTO users (cert, uuid, user_id) VALUES (?1, ?2, ?3)",
|
||||
params!(cert, uuid, user_id)
|
||||
);
|
||||
|
||||
uuid
|
||||
}
|
||||
|
||||
pub fn delete_uuid(user_id: i64) {
|
||||
DATABASE.lock_and_exec("DELETE FROM users WHERE user_id=?1", params!(user_id));
|
||||
}
|
||||
|
||||
fn vacuum_database() {
|
||||
DATABASE.lock_and_exec("VACUUM", params!());
|
||||
}
|
||||
|
||||
pub fn get_user_cert(uuid: &str) -> Option<(i64, String)> {
|
||||
let user_id = DATABASE.lock_and_select("SELECT user_id FROM users WHERE uuid=?1;", params!(uuid)).ok()?.parse::<i64>().ok()?;
|
||||
let cert = DATABASE.lock_and_select("SELECT cert FROM users WHERE uuid=?1;", params!(uuid)).ok()?;
|
||||
|
||||
Some((user_id, cert))
|
||||
}
|
||||
|
||||
pub fn is_registered(uuid: &str) -> bool {
|
||||
match get_user_cert(uuid) {
|
||||
Some((_, cert)) => pem::parse(&cert).is_ok(),
|
||||
None => false
|
||||
}
|
||||
}
|
||||
|
||||
pub fn verify_fingerprint(uuid: &str, fingerprint: &str, cert: &str) -> bool {
|
||||
let Ok(signature) = general_purpose::STANDARD.decode(fingerprint) else {
|
||||
return false;
|
||||
};
|
||||
|
||||
verify_signature(&signature, uuid.as_bytes(), cert)
|
||||
}
|
||||
|
||||
fn verify_signature(signature: &[u8], message: &[u8], public_key: &str) -> bool {
|
||||
let Ok(pem) = pem::parse(public_key) else {
|
||||
return false;
|
||||
};
|
||||
let Ok(public_key) = RsaPublicKey::from_public_key_der(&pem.contents()) else {
|
||||
return false;
|
||||
};
|
||||
let digest = Sha1::digest(message);
|
||||
|
||||
public_key
|
||||
.verify(Pkcs1v15Sign::new::<Sha1>(), &digest, signature)
|
||||
.is_ok()
|
||||
}
|
||||
|
||||
pub fn get_uuid(headers: &HeaderMap, body: &str) -> String {
|
||||
let blank_header = HeaderValue::from_static("");
|
||||
let login = headers.get("a6573cbe").unwrap_or(&blank_header).to_str().unwrap_or("");
|
||||
let uid = headers.get("aoharu-user-id").unwrap_or(&blank_header).to_str().unwrap_or("");
|
||||
let version = headers.get("aoharu-client-version").unwrap_or(&blank_header).to_str().unwrap_or("");
|
||||
let timestamp = headers.get("aoharu-timestamp").unwrap_or(&blank_header).to_str().unwrap_or("");
|
||||
if uid.is_empty() || login.is_empty() || version.is_empty() || timestamp.is_empty() {
|
||||
return String::new();
|
||||
}
|
||||
|
||||
let Ok(cert) = DATABASE.lock_and_select("SELECT cert FROM users WHERE user_id=?1;", params!(uid)) else {
|
||||
return String::new();
|
||||
};
|
||||
|
||||
let data = format!("{}{}{}{}{}", uid, "sk1bdzb310n0s9tl", version, timestamp, body);
|
||||
let encoded = general_purpose::STANDARD.encode(data.as_bytes());
|
||||
|
||||
let decoded = general_purpose::STANDARD.decode(login).unwrap_or_default();
|
||||
|
||||
if verify_signature(&decoded, encoded.as_bytes(), &cert) {
|
||||
DATABASE.lock_and_select("SELECT uuid FROM users WHERE user_id=?1;", params!(uid)).unwrap()
|
||||
} else {
|
||||
String::new()
|
||||
}
|
||||
}
|
||||
|
||||
fn rot13(input: &str) -> String {
|
||||
let mut result = String::new();
|
||||
for c in input.chars() {
|
||||
let shifted = match c {
|
||||
'A'..='Z' => ((c as u8 - b'A' + 13) % 26 + b'A') as char,
|
||||
'a'..='z' => ((c as u8 - b'a' + 13) % 26 + b'a') as char,
|
||||
_ => c,
|
||||
};
|
||||
result.push(shifted);
|
||||
}
|
||||
result
|
||||
}
|
||||
pub fn decrypt_transfer_password(password: &str) -> String {
|
||||
let reversed = password.chars().rev().collect::<String>();
|
||||
let rot = rot13(&reversed);
|
||||
let decoded = general_purpose::STANDARD.decode(rot).unwrap_or_default();
|
||||
|
||||
String::from_utf8_lossy(&decoded).to_string()
|
||||
}
|
||||
353
src/database/permissions.rs
Normal file
353
src/database/permissions.rs
Normal file
@@ -0,0 +1,353 @@
|
||||
use lazy_static::lazy_static;
|
||||
use rusqlite::params;
|
||||
use jzon::{array, object, JsonValue};
|
||||
|
||||
use crate::router::global;
|
||||
use crate::sql::SQLite;
|
||||
|
||||
lazy_static! {
|
||||
static ref DATABASE: SQLite = SQLite::new("permissions.db", setup_tables);
|
||||
}
|
||||
|
||||
// Scopes are flat dotted strings and imply everything below them: holding
|
||||
// "card" grants "card.upload", and "*" grants everything. That hierarchy is
|
||||
// the only notion of "level" - there is no rank integer, so a new capability
|
||||
// is one line here and never a renumbering of anything else.
|
||||
//
|
||||
// Every call site must pass one of these consts, never a literal: an
|
||||
// unrecognised scope string can only ever fail closed in has(), but grant()
|
||||
// rejects it outright so a typo can't be persisted either.
|
||||
pub const ALL: &str = "*";
|
||||
|
||||
pub const CARD: &str = "card";
|
||||
// Create custom cards/characters, and edit or delete your OWN uploads
|
||||
pub const CARD_UPLOAD: &str = "card.upload";
|
||||
// Publish/unpublish and mark obtainable, on your OWN uploads
|
||||
pub const CARD_PUBLISH: &str = "card.publish";
|
||||
// Moderation: edit, delete, publish or unpublish ANYBODY's cards
|
||||
pub const CARD_EDIT: &str = "card.edit";
|
||||
|
||||
pub const PERMISSION: &str = "permission";
|
||||
pub const PERMISSION_GRANT: &str = "permission.grant";
|
||||
pub const PERMISSION_REVOKE: &str = "permission.revoke";
|
||||
|
||||
// The whole grantable vocabulary, subtree roots included. Anything not in here
|
||||
// cannot be written to the table
|
||||
pub const SCOPES: &[&str] = &[
|
||||
ALL,
|
||||
CARD, CARD_UPLOAD, CARD_PUBLISH, CARD_EDIT,
|
||||
PERMISSION, PERMISSION_GRANT, PERMISSION_REVOKE
|
||||
];
|
||||
|
||||
// Grants live in their own database rather than in userdata.db so that an
|
||||
// account purge can never take administrative state with it
|
||||
fn setup_tables(conn: &rusqlite::Connection) {
|
||||
conn.execute_batch("
|
||||
CREATE TABLE IF NOT EXISTS grants (
|
||||
user_id BIGINT NOT NULL,
|
||||
scope TEXT NOT NULL,
|
||||
granted_by BIGINT NOT NULL,
|
||||
granted_at BIGINT NOT NULL,
|
||||
PRIMARY KEY (user_id, scope)
|
||||
);
|
||||
").unwrap();
|
||||
}
|
||||
|
||||
// The owners are a process-level flag (--owner) rather than table rows: they
|
||||
// are the bootstrap grantors, so they have to work on a fresh install with an
|
||||
// empty (or hand-deleted) permissions.db, and they must not be revocable
|
||||
// through the webui
|
||||
fn is_owner(user_id: i64) -> bool {
|
||||
user_id > 0 && crate::runtime::get_owners().contains(&user_id)
|
||||
}
|
||||
|
||||
// Every scope that would satisfy a request for `scope`: "*", each dotted
|
||||
// ancestor, and the scope itself. Matching is on whole dot-separated segments,
|
||||
// so "car" never satisfies "card.upload"
|
||||
fn implied_by(scope: &str) -> Vec<String> {
|
||||
if scope == ALL {
|
||||
return vec![String::from(ALL)];
|
||||
}
|
||||
let mut rv = vec![String::from(ALL)];
|
||||
let mut prefix = String::new();
|
||||
for part in scope.split('.') {
|
||||
if !prefix.is_empty() {
|
||||
prefix.push('.');
|
||||
}
|
||||
prefix.push_str(part);
|
||||
rv.push(prefix.clone());
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
fn held_scopes(user_id: i64) -> Vec<String> {
|
||||
let rows = DATABASE.lock_and_select_all("SELECT scope FROM grants WHERE user_id=?1 ORDER BY scope", params!(user_id)).unwrap_or(array![]);
|
||||
rows.members().map(|scope| scope.to_string()).collect()
|
||||
}
|
||||
|
||||
fn insert(user_id: i64, scope: &str, granted_by: i64) {
|
||||
DATABASE.lock_and_exec(
|
||||
"INSERT OR IGNORE INTO grants (user_id, scope, granted_by, granted_at) VALUES (?1, ?2, ?3, ?4)",
|
||||
params!(user_id, scope, granted_by, global::timestamp() as i64)
|
||||
);
|
||||
}
|
||||
|
||||
// A user with no row holds nothing at all
|
||||
pub fn has(user_id: i64, scope: &str) -> bool {
|
||||
if user_id <= 0 {
|
||||
return false;
|
||||
}
|
||||
if is_owner(user_id) {
|
||||
return true;
|
||||
}
|
||||
let held = held_scopes(user_id);
|
||||
implied_by(scope).iter().any(|candidate| held.contains(candidate))
|
||||
}
|
||||
|
||||
// Everything this user holds, for the webui to hide what it can't use. An
|
||||
// owner's implicit "*" is reported here even though it has no row
|
||||
pub fn scopes_for(user_id: i64) -> JsonValue {
|
||||
if user_id <= 0 {
|
||||
return array![];
|
||||
}
|
||||
let mut scopes: Vec<String> = Vec::new();
|
||||
if is_owner(user_id) {
|
||||
scopes.push(String::from(ALL));
|
||||
}
|
||||
for scope in held_scopes(user_id) {
|
||||
if !scopes.contains(&scope) {
|
||||
scopes.push(scope);
|
||||
}
|
||||
}
|
||||
let mut rv = array![];
|
||||
for scope in scopes {
|
||||
rv.push(scope).unwrap();
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
pub fn grants() -> JsonValue {
|
||||
let conn = rusqlite::Connection::open(DATABASE.get_path()).unwrap();
|
||||
let Ok(mut stmt) = conn.prepare("SELECT user_id, scope, granted_by, granted_at FROM grants ORDER BY user_id, scope") else {
|
||||
return array![];
|
||||
};
|
||||
let Ok(mapped) = stmt.query_map(params!(), |row| {
|
||||
Ok(object!{
|
||||
user_id: row.get::<usize, i64>(0)?,
|
||||
scope: row.get::<usize, String>(1)?,
|
||||
granted_by: row.get::<usize, i64>(2)?,
|
||||
granted_at: row.get::<usize, i64>(3)?
|
||||
})
|
||||
}) else {
|
||||
return array![];
|
||||
};
|
||||
let mut rv = array![];
|
||||
for row in mapped.flatten() {
|
||||
rv.push(row).unwrap();
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// The only way a row is ever written. Two conditions, both required:
|
||||
//
|
||||
// 1. the grantor holds permission.grant, and
|
||||
// 2. the grantor holds the scope being granted
|
||||
//
|
||||
// (2) is what makes escalation impossible. has() only ever implies downwards,
|
||||
// so holding a leaf never satisfies its parent - a user with card.upload can
|
||||
// hand out card.upload and nothing else, and can no more grant themselves
|
||||
// "card" (or "*") than they can grant it to anybody else. Both checks read the
|
||||
// live table, so a revoked grantor loses the ability on their next request
|
||||
pub fn grant(user_id: i64, scope: &str, granted_by: i64) -> Result<(), String> {
|
||||
if user_id <= 0 {
|
||||
return Err(String::from("Invalid user id"));
|
||||
}
|
||||
if !SCOPES.contains(&scope) {
|
||||
return Err(format!("Unknown scope '{}'", scope));
|
||||
}
|
||||
if !has(granted_by, PERMISSION_GRANT) {
|
||||
return Err(String::from("You do not have permission to grant scopes"));
|
||||
}
|
||||
if !has(granted_by, scope) {
|
||||
return Err(format!("You cannot grant '{}' because you do not hold it yourself", scope));
|
||||
}
|
||||
insert(user_id, scope, granted_by);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Revoking needs the same "you must hold it yourself" rule as granting, so a
|
||||
// junior admin can't strip a senior one. An owner has no rows to delete, but
|
||||
// the check is explicit so it stays true if that ever changes
|
||||
pub fn revoke(user_id: i64, scope: &str, revoked_by: i64) -> Result<(), String> {
|
||||
if user_id <= 0 {
|
||||
return Err(String::from("Invalid user id"));
|
||||
}
|
||||
if !SCOPES.contains(&scope) {
|
||||
return Err(format!("Unknown scope '{}'", scope));
|
||||
}
|
||||
if !has(revoked_by, PERMISSION_REVOKE) {
|
||||
return Err(String::from("You do not have permission to revoke scopes"));
|
||||
}
|
||||
if !has(revoked_by, scope) {
|
||||
return Err(format!("You cannot revoke '{}' because you do not hold it yourself", scope));
|
||||
}
|
||||
if is_owner(user_id) {
|
||||
return Err(String::from("A server owner's scopes cannot be revoked"));
|
||||
}
|
||||
DATABASE.lock_and_exec("DELETE FROM grants WHERE user_id=?1 AND scope=?2", params!(user_id, scope));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
// Every test holds the shared test data path lock, so uids are hand-picked
|
||||
// to not collide between tests rather than cleaned up between them
|
||||
fn wipe(user_id: i64) {
|
||||
DATABASE.lock_and_exec("DELETE FROM grants WHERE user_id=?1", params!(user_id));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn subtree_implies_leaf_but_not_the_reverse() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(101);
|
||||
assert!(!has(101, CARD_UPLOAD));
|
||||
insert(101, CARD, 0);
|
||||
assert!(has(101, CARD_UPLOAD));
|
||||
assert!(has(101, CARD_EDIT));
|
||||
assert!(has(101, CARD));
|
||||
assert!(!has(101, PERMISSION_GRANT));
|
||||
assert!(!has(101, ALL));
|
||||
wipe(101);
|
||||
|
||||
insert(101, CARD_UPLOAD, 0);
|
||||
assert!(has(101, CARD_UPLOAD));
|
||||
assert!(!has(101, CARD));
|
||||
assert!(!has(101, CARD_PUBLISH));
|
||||
wipe(101);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn star_implies_everything() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(103);
|
||||
insert(103, ALL, 0);
|
||||
for scope in SCOPES {
|
||||
assert!(has(103, scope), "scope {}", scope);
|
||||
}
|
||||
wipe(103);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn partial_segment_is_not_a_prefix() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(104);
|
||||
insert(104, "car", 0);
|
||||
assert!(!has(104, CARD_UPLOAD));
|
||||
assert!(!has(104, CARD));
|
||||
insert(104, "card.uplo", 0);
|
||||
assert!(!has(104, CARD_UPLOAD));
|
||||
wipe(104);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn absent_user_holds_nothing() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(105);
|
||||
for scope in SCOPES {
|
||||
assert!(!has(105, scope), "scope {}", scope);
|
||||
}
|
||||
assert!(scopes_for(105).is_empty());
|
||||
assert!(!has(0, ALL));
|
||||
assert!(!has(-1, ALL));
|
||||
wipe(105);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn grant_and_revoke_need_the_scope_and_the_ability() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
for uid in [110, 111, 112, 113] {
|
||||
wipe(uid);
|
||||
}
|
||||
// A grantor with permission.grant and card.upload can hand out
|
||||
// card.upload and nothing else - escalation is impossible
|
||||
insert(110, PERMISSION_GRANT, 0);
|
||||
insert(110, CARD_UPLOAD, 0);
|
||||
grant(111, CARD_UPLOAD, 110).unwrap();
|
||||
grant(111, CARD_UPLOAD, 110).unwrap(); // idempotent
|
||||
assert_eq!(held_scopes(111), vec![String::from(CARD_UPLOAD)]);
|
||||
assert!(grant(111, CARD_EDIT, 110).is_err());
|
||||
assert!(grant(111, CARD, 110).is_err());
|
||||
assert!(grant(110, ALL, 110).is_err());
|
||||
assert!(!has(111, CARD_EDIT));
|
||||
|
||||
// No permission.grant / permission.revoke - no managing at all
|
||||
insert(112, ALL, 0);
|
||||
insert(113, CARD_UPLOAD, 0);
|
||||
assert!(grant(113, CARD_UPLOAD, 113).is_err());
|
||||
assert!(revoke(112, ALL, 113).is_err());
|
||||
|
||||
// Revoking needs the revoked scope held too
|
||||
insert(110, PERMISSION_REVOKE, 0);
|
||||
assert!(revoke(112, ALL, 110).is_err());
|
||||
assert!(has(112, ALL));
|
||||
revoke(111, CARD_UPLOAD, 110).unwrap();
|
||||
assert!(!has(111, CARD_UPLOAD));
|
||||
|
||||
for uid in [110, 111, 112, 113] {
|
||||
wipe(uid);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unknown_scopes_are_rejected() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(116);
|
||||
wipe(117);
|
||||
insert(116, ALL, 0);
|
||||
assert!(grant(117, "card.explode", 116).is_err());
|
||||
assert!(revoke(117, "card.explode", 116).is_err());
|
||||
assert!(grant(117, "song.upload", 116).is_err());
|
||||
assert!(grant(0, CARD_UPLOAD, 116).is_err());
|
||||
wipe(116);
|
||||
wipe(117);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn owners_hold_everything_without_a_row() {
|
||||
let _lock = crate::runtime::lock_test_data_path();
|
||||
wipe(118);
|
||||
wipe(119);
|
||||
crate::runtime::update_owners(&[118, 120]);
|
||||
for scope in SCOPES {
|
||||
assert!(has(118, scope), "scope {}", scope);
|
||||
assert!(has(120, scope), "scope {}", scope);
|
||||
}
|
||||
assert_eq!(scopes_for(118).len(), 1);
|
||||
assert_eq!(scopes_for(118)[0].to_string(), String::from(ALL));
|
||||
assert!(held_scopes(118).is_empty());
|
||||
// An owner can bootstrap-grant, and can't be revoked
|
||||
grant(119, ALL, 118).unwrap();
|
||||
assert!(has(119, ALL));
|
||||
insert(118, CARD_UPLOAD, 0);
|
||||
assert!(revoke(118, CARD_UPLOAD, 119).is_err());
|
||||
assert!(has(118, CARD_UPLOAD));
|
||||
// Dropping owner status drops the implicit "*"
|
||||
crate::runtime::update_owners(&[]);
|
||||
assert!(!has(118, CARD_EDIT));
|
||||
wipe(118);
|
||||
wipe(119);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_vocabulary_is_wellformed() {
|
||||
for scope in SCOPES {
|
||||
assert!(!scope.is_empty());
|
||||
assert!(!scope.ends_with('.'));
|
||||
}
|
||||
for scope in [CARD_UPLOAD, CARD_PUBLISH, CARD_EDIT, PERMISSION_GRANT, PERMISSION_REVOKE] {
|
||||
assert!(SCOPES.contains(&scope), "scope {}", scope);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,53 +1,43 @@
|
||||
use openssl::symm::{Cipher, Crypter, Mode};
|
||||
use openssl::error::ErrorStack;
|
||||
use base64::{Engine as _, engine::general_purpose};
|
||||
use rand::Rng;
|
||||
use rand::RngExt;
|
||||
use aes::cipher::{block_padding::Pkcs7, BlockModeEncrypt, BlockModeDecrypt, KeyIvInit};
|
||||
|
||||
type Aes256CbcEnc = cbc::Encryptor<aes::Aes256>;
|
||||
type Aes256CbcDec = cbc::Decryptor<aes::Aes256>;
|
||||
|
||||
const IV_LENGTH: usize = 16;
|
||||
const KEY: &str = "3559b435f24b297a79c68b9709ef2125";
|
||||
|
||||
pub fn decrypt_packet(base64_input: &str) -> Result<String, ErrorStack> {
|
||||
pub fn decrypt_packet(base64_input: &str) -> Result<String, String> {
|
||||
if base64_input.len() < IV_LENGTH + 1 {
|
||||
return Ok(String::new());
|
||||
}
|
||||
let base64_buffer = general_purpose::STANDARD.decode(base64_input).unwrap();
|
||||
|
||||
let decryption_iv = &base64_buffer[..IV_LENGTH];
|
||||
let ciphertext = &base64_buffer[IV_LENGTH..];
|
||||
let mut ciphertext = base64_buffer[IV_LENGTH..].to_vec();
|
||||
|
||||
let cipher = Cipher::aes_256_cbc();
|
||||
let mut decrypter = Crypter::new(cipher, Mode::Decrypt, KEY.as_bytes(), Some(decryption_iv))?;
|
||||
let decrypted_data = Aes256CbcDec::new(&KEY.as_bytes().try_into().unwrap(), decryption_iv.try_into().unwrap())
|
||||
.decrypt_padded::<Pkcs7>(&mut ciphertext).ok()
|
||||
.ok_or(String::from("uhoh"))?;
|
||||
|
||||
let mut decrypted_data = vec![0u8; ciphertext.len() + cipher.block_size()];
|
||||
let mut decrypted_len = decrypter.update(ciphertext, &mut decrypted_data)?;
|
||||
decrypted_len += decrypter.finalize(&mut decrypted_data[decrypted_len..])?;
|
||||
|
||||
decrypted_data.truncate(decrypted_len);
|
||||
|
||||
Ok(String::from_utf8(decrypted_data).unwrap())
|
||||
Ok(String::from_utf8(decrypted_data.to_vec()).unwrap())
|
||||
}
|
||||
|
||||
pub fn encrypt_packet(input: &str) -> Result<String, ErrorStack> {
|
||||
let cipher = Cipher::aes_256_cbc();
|
||||
pub fn encrypt_packet(input: &str) -> Result<String, String> {
|
||||
let encryption_iv = generate_random_iv();
|
||||
|
||||
let mut encrypter = Crypter::new(cipher, Mode::Encrypt, KEY.as_bytes(), Some(&encryption_iv))?;
|
||||
|
||||
let mut encrypted_data = vec![0u8; input.len() + cipher.block_size()];
|
||||
let mut encrypted_len = encrypter.update(input.as_bytes(), &mut encrypted_data)?;
|
||||
|
||||
encrypted_len += encrypter.finalize(&mut encrypted_data[encrypted_len..])?;
|
||||
|
||||
encrypted_data.truncate(encrypted_len);
|
||||
let encrypted = Aes256CbcEnc::new(KEY.as_bytes().try_into().unwrap(), encryption_iv.as_slice().try_into().unwrap())
|
||||
.encrypt_padded_vec::<Pkcs7>(input.as_bytes());
|
||||
|
||||
let mut result = encryption_iv.to_vec();
|
||||
result.extend_from_slice(&encrypted_data);
|
||||
result.extend_from_slice(&encrypted);
|
||||
|
||||
Ok(general_purpose::STANDARD.encode(&result))
|
||||
}
|
||||
|
||||
fn generate_random_iv() -> Vec<u8> {
|
||||
let mut rng = rand::thread_rng();
|
||||
let mut rng = rand::rng();
|
||||
let mut bytes = vec![0u8; IV_LENGTH];
|
||||
rng.fill(&mut bytes[..]);
|
||||
bytes
|
||||
|
||||
27
src/ios.rs
Normal file
27
src/ios.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
#[cfg(target_os = "ios")]
|
||||
#[unsafe(no_mangle)]
|
||||
#[unsafe(link_section = "__DATA,__mod_init_func")]
|
||||
pub static INITIALIZER: extern "C" fn() = main;
|
||||
|
||||
#[cfg(target_os = "ios")]
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn main() {
|
||||
let data_path = get_bundle_path().into_os_string().into_string().unwrap();
|
||||
crate::runtime::update_data_path(&data_path);
|
||||
|
||||
std::thread::spawn(|| {
|
||||
crate::run_server(true).unwrap();
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(target_os = "ios")]
|
||||
use objc2_foundation::{NSFileManager, NSSearchPathDirectory, NSSearchPathDomainMask};
|
||||
|
||||
#[cfg(target_os = "ios")]
|
||||
pub fn get_bundle_path() -> std::path::PathBuf {
|
||||
unsafe {
|
||||
let manager = NSFileManager::defaultManager();
|
||||
let application_support = manager.URLsForDirectory_inDomains(NSSearchPathDirectory::ApplicationSupportDirectory, NSSearchPathDomainMask::UserDomainMask);
|
||||
return application_support.to_vec_unchecked()[0].to_file_path().unwrap();
|
||||
}
|
||||
}
|
||||
86
src/lib.rs
Normal file
86
src/lib.rs
Normal file
@@ -0,0 +1,86 @@
|
||||
mod static_handlers;
|
||||
mod options;
|
||||
mod router;
|
||||
mod encryption;
|
||||
mod sql;
|
||||
pub mod runtime;
|
||||
pub mod database;
|
||||
#[macro_use]
|
||||
mod macros;
|
||||
|
||||
#[cfg(feature = "library")]
|
||||
#[cfg(target_os = "android")]
|
||||
mod android;
|
||||
|
||||
#[cfg(feature = "library")]
|
||||
#[cfg(target_os = "ios")]
|
||||
mod ios;
|
||||
|
||||
use actix_web::{rt, App, HttpServer, web, dev::Service};
|
||||
//use actix_cors::Cors;
|
||||
use std::time::Duration;
|
||||
pub use options::get_args;
|
||||
use runtime::get_data_path;
|
||||
|
||||
#[actix_web::main]
|
||||
pub async fn run_server(in_thread: bool) -> std::io::Result<()> {
|
||||
let args = get_args();
|
||||
let port = args.port;
|
||||
|
||||
runtime::update_owners(&args.owner);
|
||||
|
||||
if args.purge {
|
||||
println!("Purging accounts...");
|
||||
let ct = crate::router::userdata::purge_accounts();
|
||||
println!("Purged {} accounts", ct);
|
||||
}
|
||||
|
||||
// One-time, idempotent: charts stored before the custom-song spawn-group pairing rule are
|
||||
// regrouped in place and their catalog md5s refreshed, so clients re-download the fixed
|
||||
// encoding. No-op when custom songs are disabled or nothing needs rewriting.
|
||||
router::custom_song::migrate::run();
|
||||
|
||||
let rv = HttpServer::new(|| App::new()
|
||||
//.wrap(Cors::permissive())
|
||||
.wrap_fn(|req, srv| {
|
||||
println!("Request: {} {}", req.method(), req.path());
|
||||
|
||||
#[cfg(feature = "library")]
|
||||
#[cfg(target_os = "android")]
|
||||
log_to_logcat!("ew", "Request: {} {}", req.method(), req.path());
|
||||
|
||||
srv.call(req)
|
||||
})
|
||||
.app_data(web::PayloadConfig::default().limit(1024 * 1024 * 25))
|
||||
.service(static_handlers::maintenance)
|
||||
.configure(router::configure)
|
||||
.default_service(web::route().to(router::request))
|
||||
).bind(("0.0.0.0", port))?.run();
|
||||
|
||||
println!("Server started: http://0.0.0.0:{}", port);
|
||||
println!("Data path is set to {}", args.path);
|
||||
println!("Sif1 transfer requests will attempt to contact NPPS4 at {}", args.npps4);
|
||||
|
||||
if args.https {
|
||||
println!("Note: gree is set to https mode. http requests will fail on jp clients.");
|
||||
}
|
||||
|
||||
if in_thread {
|
||||
runtime::set_running(true);
|
||||
let handle = rv.handle();
|
||||
rt::spawn(rv);
|
||||
while runtime::get_running() {
|
||||
actix_web::rt::time::sleep(Duration::from_millis(100)).await;
|
||||
}
|
||||
handle.stop(false).await;
|
||||
println!("Stopped");
|
||||
return Ok(());
|
||||
}
|
||||
rv.await
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
pub async fn stop_server() {
|
||||
runtime::set_running(false);
|
||||
println!("Stopping");
|
||||
}
|
||||
7
src/log.c
Normal file
7
src/log.c
Normal file
@@ -0,0 +1,7 @@
|
||||
#include <android/log.h>
|
||||
|
||||
#define LOGI(tag, ...) __android_log_print(ANDROID_LOG_INFO, tag, __VA_ARGS__)
|
||||
|
||||
void android_log(const char* tag, const char* out) {
|
||||
LOGI(tag, "%s", out);
|
||||
}
|
||||
37
src/macros.rs
Normal file
37
src/macros.rs
Normal file
@@ -0,0 +1,37 @@
|
||||
// include_file macro: includes a file compressed at compile time, and decompresses it on reference. Decreases binary size
|
||||
#[macro_export]
|
||||
macro_rules! include_file {
|
||||
( $s:expr ) => {
|
||||
{
|
||||
let file = include_flate_codegen::deflate_file!($s);
|
||||
let ret = $crate::macros::decode(file);
|
||||
std::string::String::from_utf8(ret).unwrap()
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub fn decode(bytes: &[u8]) -> Vec<u8> {
|
||||
use std::io::{Cursor, Read};
|
||||
|
||||
let mut dec = libflate::deflate::Decoder::new(Cursor::new(bytes));
|
||||
let mut ret = Vec::new();
|
||||
dec.read_to_end(&mut ret).unwrap();
|
||||
ret
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! lock_onto_mutex {
|
||||
($mutex:expr) => {{
|
||||
loop {
|
||||
match $mutex.lock() {
|
||||
Ok(value) => {
|
||||
break value;
|
||||
}
|
||||
Err(_) => {
|
||||
$mutex.clear_poison();
|
||||
std::thread::sleep(std::time::Duration::from_millis(15));
|
||||
}
|
||||
}
|
||||
}
|
||||
}};
|
||||
}
|
||||
216
src/main.rs
216
src/main.rs
@@ -1,213 +1,13 @@
|
||||
mod encryption;
|
||||
mod router;
|
||||
mod sql;
|
||||
|
||||
use actix_web::{
|
||||
rt,
|
||||
App,
|
||||
HttpServer,
|
||||
get,
|
||||
HttpResponse,
|
||||
HttpRequest,
|
||||
web,
|
||||
dev::Service,
|
||||
http::header::ContentType
|
||||
};
|
||||
use clap::Parser;
|
||||
use std::fs;
|
||||
use std::sync::Mutex;
|
||||
use std::time::Duration;
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
#[get("/index.css")]
|
||||
async fn css(_req: HttpRequest) -> HttpResponse {
|
||||
HttpResponse::Ok()
|
||||
.insert_header(ContentType(mime::TEXT_CSS))
|
||||
.body(include_file!("webui/dist/index.css"))
|
||||
}
|
||||
#[get("/index.js")]
|
||||
async fn js(_req: HttpRequest) -> HttpResponse {
|
||||
HttpResponse::Ok()
|
||||
.insert_header(ContentType(mime::APPLICATION_JAVASCRIPT_UTF_8))
|
||||
.body(include_file!("webui/dist/index.js"))
|
||||
}
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
pub struct Args {
|
||||
#[arg(short, long, default_value_t = 8080, help = "Port to listen on")]
|
||||
port: u16,
|
||||
|
||||
#[arg(long, default_value = "./", help = "Path to store database files")]
|
||||
path: String,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Serve gree headers with https. WILL NOT ACCEPT HTTPS REQUESTS")]
|
||||
https: bool,
|
||||
|
||||
#[arg(long, default_value = "http://127.0.0.1:51376", help = "Address to NPPS4 server for sif account linking")]
|
||||
npps4: String,
|
||||
|
||||
//below options are for the "Help" page
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to patched android global apk for this server.")]
|
||||
global_android: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to patched android japan apk for this server.")]
|
||||
japan_android: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to patched iOS global apk for this server.")]
|
||||
global_ios: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to patched iOS japan apk for this server.")]
|
||||
japan_ios: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to asset server.")]
|
||||
assets_url: String,
|
||||
|
||||
#[arg(long, default_value_t = 0, help = "Max time returned by the server, in the JSON \"timestamp\" key.")]
|
||||
max_time: u64,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Disable webui, act completely like the original server")]
|
||||
hidden: bool,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Purge dead user accounts on startup")]
|
||||
purge: bool,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Disable user account imports")]
|
||||
disable_imports: bool,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Disable user account exports")]
|
||||
disable_exports: bool,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for English iOS client.")]
|
||||
en_ios_asset_hash: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for JP iOS client.")]
|
||||
jp_ios_asset_hash: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for English Android client.")]
|
||||
en_android_asset_hash: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for JP Android client.")]
|
||||
jp_android_asset_hash: String
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn run_server(in_thread: bool) -> std::io::Result<()> {
|
||||
let args = get_args();
|
||||
let port = args.port;
|
||||
|
||||
if args.purge {
|
||||
println!("Purging accounts...");
|
||||
let ct = crate::router::userdata::purge_accounts();
|
||||
println!("Purged {} accounts", ct);
|
||||
}
|
||||
|
||||
let rv = HttpServer::new(|| App::new()
|
||||
.wrap_fn(|req, srv| {
|
||||
println!("Request: {}", req.path());
|
||||
srv.call(req)
|
||||
})
|
||||
.app_data(web::PayloadConfig::default().limit(1024 * 1024 * 25))
|
||||
.service(css)
|
||||
.service(js)
|
||||
.default_service(web::route().to(router::request))
|
||||
).bind(("0.0.0.0", port))?.run();
|
||||
|
||||
println!("Server started: http://0.0.0.0:{}", port);
|
||||
println!("Data path is set to {}", args.path);
|
||||
println!("Sif1 transfer requests will attempt to contact NPPS4 at {}", args.npps4);
|
||||
|
||||
if args.https {
|
||||
println!("Note: gree is set to https mode. http requests will fail on jp clients.");
|
||||
}
|
||||
|
||||
if in_thread {
|
||||
set_running(true).await;
|
||||
let handle = rv.handle();
|
||||
rt::spawn(rv);
|
||||
while get_running().await {
|
||||
actix_web::rt::time::sleep(Duration::from_millis(100)).await;
|
||||
}
|
||||
handle.stop(false).await;
|
||||
println!("Stopped");
|
||||
return Ok(());
|
||||
}
|
||||
rv.await
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn stop_server() {
|
||||
set_running(false).await;
|
||||
println!("Stopping");
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "library"))]
|
||||
fn main() -> std::io::Result<()> {
|
||||
run_server(false)
|
||||
let args = ew::get_args();
|
||||
ew::runtime::update_data_path(&args.path);
|
||||
ew::runtime::update_masterdata_path(&args.masterdata);
|
||||
ew::run_server(false)
|
||||
}
|
||||
|
||||
pub fn get_args() -> Args {
|
||||
Args::parse()
|
||||
}
|
||||
|
||||
pub fn get_data_path(file_name: &str) -> String {
|
||||
let args = get_args();
|
||||
let mut path = args.path;
|
||||
while path.ends_with('/') {
|
||||
path.pop();
|
||||
}
|
||||
fs::create_dir_all(&path).unwrap();
|
||||
format!("{}/{}", path, file_name)
|
||||
}
|
||||
|
||||
// include_file macro: includes a file compressed at compile time, and decompresses it on reference. Decreases binary size
|
||||
#[macro_export]
|
||||
macro_rules! include_file {
|
||||
( $s:expr ) => {
|
||||
{
|
||||
let file = include_flate_codegen::deflate_file!($s);
|
||||
let ret = $crate::decode(file);
|
||||
std::string::String::from_utf8(ret).unwrap()
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub fn decode(bytes: &[u8]) -> Vec<u8> {
|
||||
use std::io::{Cursor, Read};
|
||||
|
||||
let mut dec = libflate::deflate::Decoder::new(Cursor::new(bytes));
|
||||
let mut ret = Vec::new();
|
||||
dec.read_to_end(&mut ret).unwrap();
|
||||
ret
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! lock_onto_mutex {
|
||||
($mutex:expr) => {{
|
||||
loop {
|
||||
match $mutex.lock() {
|
||||
Ok(value) => {
|
||||
break value;
|
||||
}
|
||||
Err(_) => {
|
||||
$mutex.clear_poison();
|
||||
actix_web::rt::time::sleep(std::time::Duration::from_millis(15)).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
}};
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref RUNNING: Mutex<bool> = Mutex::new(false);
|
||||
}
|
||||
|
||||
async fn set_running(running: bool) {
|
||||
let mut result = lock_onto_mutex!(RUNNING);
|
||||
*result = running;
|
||||
}
|
||||
|
||||
async fn get_running() -> bool {
|
||||
let result = lock_onto_mutex!(RUNNING);
|
||||
*result
|
||||
#[cfg(feature = "library")]
|
||||
fn main() {
|
||||
panic!("Compiled with the library feature! You should load the shared object library and call the exported methods there.");
|
||||
}
|
||||
|
||||
88
src/options.rs
Normal file
88
src/options.rs
Normal file
@@ -0,0 +1,88 @@
|
||||
use clap::Parser;
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
pub struct Args {
|
||||
#[arg(short, long, default_value_t = 8080, help = "Port to listen on")]
|
||||
pub port: u16,
|
||||
|
||||
#[arg(long, default_value = "./", help = "Path to store database files")]
|
||||
pub path: String,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Serve gree headers with https. WILL NOT ACCEPT HTTPS REQUESTS")]
|
||||
pub https: bool,
|
||||
|
||||
#[arg(long, default_value = "http://127.0.0.1:51376", help = "Address to NPPS4 server for sif account linking")]
|
||||
pub npps4: String,
|
||||
|
||||
//below options are for the "Help" page
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to patched android global apk for this server.")]
|
||||
pub global_android: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to patched android japan apk for this server.")]
|
||||
pub japan_android: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to patched iOS global apk for this server.")]
|
||||
pub global_ios: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to patched iOS japan apk for this server.")]
|
||||
pub japan_ios: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Link to asset server.")]
|
||||
pub assets_url: String,
|
||||
|
||||
#[arg(long, default_value_t = 0, help = "Max time returned by the server, in the JSON \"timestamp\" key.")]
|
||||
pub max_time: u64,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Disable webui, act completely like the original server")]
|
||||
pub hidden: bool,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Enable the custom songs feature (upload/browse/download). Disabled by default; every custom-songs endpoint and webui element is hidden unless this is set")]
|
||||
pub enable_custom_songs: bool,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Enable the custom cards feature (upload/manage runtime cards and characters). Disabled by default; every custom-cards endpoint and webui element is hidden unless this is set")]
|
||||
pub enable_custom_cards: bool,
|
||||
|
||||
#[arg(long, value_delimiter = ',', help = "User id(s) of the server owner(s), repeatable or comma separated. Owner accounts implicitly hold every permission scope and are the only ones able to grant scopes on a fresh install")]
|
||||
pub owner: Vec<i64>,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Purge dead user accounts on startup")]
|
||||
pub purge: bool,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Disable user account imports")]
|
||||
pub disable_imports: bool,
|
||||
|
||||
#[arg(long, default_value_t = false, help = "Disable user account exports")]
|
||||
pub disable_exports: bool,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for English iOS client.")]
|
||||
pub en_ios_asset_hash: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for JP iOS client.")]
|
||||
pub jp_ios_asset_hash: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for English Android client.")]
|
||||
pub en_android_asset_hash: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for JP Android client.")]
|
||||
pub jp_android_asset_hash: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset version for overridden asset hashes.")]
|
||||
pub asset_version: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Asset hash for windows client.")]
|
||||
pub windows_asset_hash: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Path to image assets.")]
|
||||
pub image_asset_path: String,
|
||||
|
||||
#[arg(long, default_value = "", help = "Optional directory to load master data CSVs from at runtime. Layout mirrors the bundled assets (csv/, csv-en/). Missing files fall back to the internal copies.")]
|
||||
pub masterdata: String
|
||||
}
|
||||
|
||||
pub fn get_args() -> Args {
|
||||
let mut args = Args::parse();
|
||||
crate::runtime::overlay_args(&mut args);
|
||||
args
|
||||
}
|
||||
340
src/router.rs
340
src/router.rs
@@ -20,6 +20,9 @@ pub mod serial_code;
|
||||
pub mod web;
|
||||
pub mod card;
|
||||
pub mod shop;
|
||||
pub mod custom_song;
|
||||
pub mod custom_card;
|
||||
pub mod rich_text;
|
||||
pub mod webui;
|
||||
pub mod clear_rate;
|
||||
pub mod exchange;
|
||||
@@ -27,17 +30,147 @@ pub mod items;
|
||||
pub mod databases;
|
||||
pub mod location;
|
||||
pub mod event_ranking;
|
||||
mod tools;
|
||||
|
||||
use actix_web::{
|
||||
HttpResponse,
|
||||
HttpRequest,
|
||||
http::header::HeaderValue,
|
||||
http::header::HeaderMap
|
||||
FromRequest,
|
||||
Responder,
|
||||
body::{BoxBody, MessageBody},
|
||||
dev::{Payload, ServiceRequest, ServiceResponse},
|
||||
middleware::{from_fn, Next},
|
||||
};
|
||||
use json::{JsonValue, object};
|
||||
use futures_util::future::LocalBoxFuture;
|
||||
use futures_util::FutureExt;
|
||||
use jzon::{JsonValue, object};
|
||||
use crate::encryption;
|
||||
|
||||
fn unhandled(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
pub struct Body(pub JsonValue);
|
||||
|
||||
pub struct Login(pub String);
|
||||
|
||||
struct SessionError(HttpRequest);
|
||||
|
||||
impl std::fmt::Debug for SessionError {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, "invalid session for uid {}", global::get_uid(self.0.headers()))
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for SessionError {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
write!(f, "{:?}", self)
|
||||
}
|
||||
}
|
||||
|
||||
impl actix_web::ResponseError for SessionError {
|
||||
fn error_response(&self) -> HttpResponse {
|
||||
println!("Rejecting request from uid {}: bad session", global::get_uid(self.0.headers()));
|
||||
global::api_error(&self.0, global::RESULT_SESSION)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Session {
|
||||
pub key: String,
|
||||
pub body: JsonValue,
|
||||
}
|
||||
|
||||
pub trait ApiBody {
|
||||
fn into_json(self) -> JsonValue;
|
||||
}
|
||||
|
||||
impl ApiBody for JsonValue {
|
||||
fn into_json(self) -> JsonValue {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Api<T = JsonValue>(pub Option<T>);
|
||||
|
||||
impl<T: ApiBody> Responder for Api<T> {
|
||||
type Body = BoxBody;
|
||||
|
||||
fn respond_to(self, req: &HttpRequest) -> HttpResponse {
|
||||
global::api(req, self.0.map(ApiBody::into_json))
|
||||
}
|
||||
}
|
||||
|
||||
impl FromRequest for Body {
|
||||
type Error = actix_web::Error;
|
||||
type Future = LocalBoxFuture<'static, Result<Self, Self::Error>>;
|
||||
|
||||
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
|
||||
let fut = String::from_request(req, payload);
|
||||
async move {
|
||||
Ok(Body(jzon::parse(&encryption::decrypt_packet(&fut.await?).unwrap()).unwrap()))
|
||||
}.boxed_local()
|
||||
}
|
||||
}
|
||||
|
||||
impl FromRequest for Login {
|
||||
type Error = actix_web::Error;
|
||||
type Future = LocalBoxFuture<'static, Result<Self, Self::Error>>;
|
||||
|
||||
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
|
||||
let headers = req.headers().clone();
|
||||
let req = req.clone();
|
||||
let fut = String::from_request(&req, payload);
|
||||
async move {
|
||||
let key = global::get_login(&headers, &encryption::decrypt_packet(&fut.await?).unwrap());
|
||||
if key.is_empty() {
|
||||
return Err(SessionError(req).into());
|
||||
}
|
||||
Ok(Login(key))
|
||||
}.boxed_local()
|
||||
}
|
||||
}
|
||||
|
||||
impl FromRequest for Session {
|
||||
type Error = actix_web::Error;
|
||||
type Future = LocalBoxFuture<'static, Result<Self, Self::Error>>;
|
||||
|
||||
fn from_request(req: &HttpRequest, payload: &mut Payload) -> Self::Future {
|
||||
let headers = req.headers().clone();
|
||||
let req = req.clone();
|
||||
let fut = String::from_request(&req, payload);
|
||||
async move {
|
||||
let body = encryption::decrypt_packet(&fut.await?).unwrap();
|
||||
let key = global::get_login(&headers, &body);
|
||||
if key.is_empty() {
|
||||
return Err(SessionError(req).into());
|
||||
}
|
||||
Ok(Session { key, body: jzon::parse(&body).unwrap() })
|
||||
}.boxed_local()
|
||||
}
|
||||
}
|
||||
|
||||
// Requests without client headers (a browser) get the webui
|
||||
async fn webui_fallback(req: ServiceRequest, next: Next<impl MessageBody + 'static>) -> Result<ServiceResponse<BoxBody>, actix_web::Error> {
|
||||
let is_from_game = req.headers().get("aoharu-asset-version").is_some() || req.path().starts_with("/api/webui");
|
||||
if !is_from_game {
|
||||
let req = req.into_parts().0;
|
||||
let resp = if crate::get_args().hidden {
|
||||
not_found(&req)
|
||||
} else {
|
||||
webui::main(req.clone())
|
||||
};
|
||||
return Ok(ServiceResponse::new(req, resp));
|
||||
}
|
||||
Ok(next.call(req).await?.map_into_boxed_body())
|
||||
}
|
||||
|
||||
async fn asset_gate(req: ServiceRequest, next: Next<impl MessageBody + 'static>) -> Result<ServiceResponse<BoxBody>, actix_web::Error> {
|
||||
let check_hash = !matches!(req.path(), "/api/start" | "/api/start/assetHash");
|
||||
if let Some(code) = global::check_asset_headers(req.headers(), check_hash) {
|
||||
let req = req.into_parts().0;
|
||||
let resp = global::api_error(&req, code);
|
||||
return Ok(ServiceResponse::new(req, resp));
|
||||
}
|
||||
Ok(next.call(req).await?.map_into_boxed_body())
|
||||
}
|
||||
|
||||
fn unhandled(req: &HttpRequest, body: String) -> Option<JsonValue> {
|
||||
if body != String::new() {
|
||||
println!("{}", encryption::decrypt_packet(&body).unwrap_or(body));
|
||||
}
|
||||
@@ -45,177 +178,116 @@ fn unhandled(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
None
|
||||
}
|
||||
|
||||
fn not_found(headers: &HeaderMap) -> HttpResponse {
|
||||
fn not_found(req: &HttpRequest) -> HttpResponse {
|
||||
let rv = object!{
|
||||
"code": 4,
|
||||
"server_time": global::timestamp(),
|
||||
"message": ""
|
||||
};
|
||||
global::send(rv, 0, headers)
|
||||
global::send(rv, 0, req)
|
||||
}
|
||||
|
||||
// Fallback for paths no actix route matched. Game endpoints live in each module's routes()
|
||||
async fn api_req(req: HttpRequest, body: String) -> HttpResponse {
|
||||
let headers = req.headers().clone();
|
||||
let args = crate::get_args();
|
||||
if args.hidden && (req.path().starts_with("/api/webui/") || !(req.path().starts_with("/api") || req.path().starts_with("/v1.0"))) {
|
||||
return not_found(&headers);
|
||||
return not_found(&req);
|
||||
} else if !req.path().starts_with("/api") && !req.path().starts_with("/v1.0") {
|
||||
return webui::main(req);
|
||||
}
|
||||
let blank_header = HeaderValue::from_static("");
|
||||
let uid = req.headers().get("aoharu-user-id").unwrap_or(&blank_header).to_str().unwrap_or("").parse::<i64>().unwrap_or(0);
|
||||
let resp: Option<JsonValue> = if req.method() == "POST" {
|
||||
match req.path() {
|
||||
"/api/debug/error" => debug::error(req, body),
|
||||
"/api/start" => start::start(req, body),
|
||||
"/api/start/assetHash" => start::asset_hash(req, body),
|
||||
"/api/dummy/login" => login::dummy(req, body),
|
||||
"/api/user" => user::user_post(req, body),
|
||||
"/api/chat/home" => chat::home(req, body),
|
||||
"/api/chat/talk/start" => chat::start(req, body),
|
||||
"/api/chat/talk/end" => chat::end(req, body),
|
||||
"/api/story/read" => story::read(req, body),
|
||||
"/api/user/initialize" => user::initialize(req, body),
|
||||
"/api/user/detail" => user::detail(req, body),
|
||||
"/api/gift" => user::gift(req, body),
|
||||
"/api/deck" => user::deck(req, body),
|
||||
"/api/tutorial" => tutorial::tutorial(req, body),
|
||||
"/api/friend" => friend::friend(req, body),
|
||||
"/api/friend/search" => friend::search(req, body),
|
||||
"/api/friend/search/recommend" => friend::recommend(req, body),
|
||||
"/api/friend/request" => friend::request(req, body),
|
||||
"/api/friend/request/approve" => friend::approve(req, body),
|
||||
"/api/friend/request/cancel" => friend::cancel(req, body),
|
||||
"/api/friend/delete" => friend::delete(req, body),
|
||||
"/api/live/guest" => live::guest(req, body),
|
||||
"/api/live/mission" => live::mission(req, body),
|
||||
"/api/live/ranking" => clear_rate::ranking(req, body),
|
||||
"/api/event" => event::event(req, body),
|
||||
"/api/event/star_event" => event::star_event(req, body),
|
||||
"/api/event/set/member" => event::set_member(req, body),
|
||||
"/api/event/ranking" => event::ranking(req, body).await,
|
||||
"/api/event_star_live/change_target_music" => event::change_target_music(req, body),
|
||||
"/api/event_star_live/start" => live::event_start(req, body),
|
||||
"/api/event_star_live/end" => event::event_end(req, body),
|
||||
"/api/event_star_live/skip" => event::event_skip(req, body),
|
||||
"/api/live/start" => live::start(req, body),
|
||||
"/api/live/end" => live::end(req, body),
|
||||
"/api/live/skip" => live::skip(req, body),
|
||||
"/api/live/retire" => live::retire(req, body),
|
||||
"/api/live/continue" => live::continuee(req, body),
|
||||
"/api/live/reward" => live::reward(req, body),
|
||||
"/api/mission/clear" => mission::clear(req, body),
|
||||
"/api/mission/receive" => mission::receive(req, body),
|
||||
"/api/home/preset" => home::preset(req, body),
|
||||
"/api/lottery/get_tutorial" => lottery::tutorial(req, body),
|
||||
"/api/lottery" => lottery::lottery_post(req, body),
|
||||
"/api/login_bonus" => login::bonus(req, body),
|
||||
"/api/login_bonus/event" => login::bonus_event(req, body),
|
||||
"/api/notice/reward" => notice::reward_post(req, body),
|
||||
"/api/user/getmigrationcode" => user::get_migration_code(req, body),
|
||||
"/api/user/registerpassword" => user::register_password(req, body),
|
||||
"/api/user/migration" => user::migration(req, body),
|
||||
"/api/user/gglrequestmigrationcode" => user::request_migration_code(req, body),
|
||||
"/api/user/gglverifymigrationcode" => user::verify_migration_code(req, body),
|
||||
"/api/serial_code" => serial_code::serial_code(req, body),
|
||||
"/api/card/reinforce" => card::reinforce(req, body),
|
||||
"/api/card/skill/reinforce" => card::skill_reinforce(req, body),
|
||||
"/api/card/evolve" => card::evolve(req, body),
|
||||
"/api/shop/buy" => shop::buy(req, body),
|
||||
"/api/user/getregisteredplatformlist" => user::getregisteredplatformlist(req, body),
|
||||
"/api/user/sif/migrate" => user::sif_migrate(req, body).await,
|
||||
"/api/user/ss/migrate" => user::sifas_migrate(req, body),
|
||||
"/api/exchange" => exchange::exchange_post(req, body),
|
||||
"/api/item/use" => items::use_item_req(req, body),
|
||||
_ => unhandled(req, body)
|
||||
}
|
||||
} else {
|
||||
match req.path() {
|
||||
"/api/user" => user::user(req),
|
||||
"/api/gift" => home::gift_get(req),
|
||||
"/api/purchase" => purchase::purchase(req),
|
||||
"/api/friend/ids" => friend::ids(req),
|
||||
"/api/live/clearRate" => clear_rate::clearrate(req).await,
|
||||
"/api/mission" => mission::mission(req),
|
||||
"/api/home" => home::home(req),
|
||||
"/api/home/preset" => home::preset_get(req),
|
||||
"/api/lottery" => lottery::lottery(req),
|
||||
"/api/notice/reward" => notice::reward(req),
|
||||
"/api/serial_code/events" => serial_code::events(req),
|
||||
"/api/album/sif" => user::sif(req),
|
||||
"/api/home/announcement" => user::announcement(req),
|
||||
"/api/shop" => shop::shop(req),
|
||||
"/api/exchange" => exchange::exchange(req),
|
||||
"/api/location" => location::location(req),
|
||||
_ => unhandled(req, body)
|
||||
}
|
||||
};
|
||||
if resp.is_some() {
|
||||
let rv = object!{
|
||||
"code": 0,
|
||||
"server_time": global::timestamp(),
|
||||
"data": resp.unwrap()
|
||||
};
|
||||
global::send(rv, uid, &headers)
|
||||
} else {
|
||||
let rv = object!{
|
||||
"code": 4,//Idontnermemrmemremremermrme <-- I think I was not okay when I put this note because I dont remmebr doing it
|
||||
"server_time": global::timestamp(),
|
||||
"message": ""
|
||||
};
|
||||
global::send(rv, uid, &headers)
|
||||
}
|
||||
let resp = unhandled(&req, body);
|
||||
global::api(&req, resp)
|
||||
}
|
||||
|
||||
pub async fn request(req: HttpRequest, body: String) -> HttpResponse {
|
||||
let args = crate::get_args();
|
||||
let headers = req.headers();
|
||||
if args.hidden && req.path().starts_with("/api/webui/") {
|
||||
return not_found(headers);
|
||||
if args.hidden && (req.path().starts_with("/api/webui/") || req.path().starts_with("/live_clear_rate.html")) {
|
||||
return not_found(&req);
|
||||
}
|
||||
if headers.get("aoharu-asset-version").is_none() && req.path().starts_with("/api") && !req.path().starts_with("/api/webui") {
|
||||
if args.hidden {
|
||||
return not_found(headers);
|
||||
} else {
|
||||
return webui::main(req);
|
||||
}
|
||||
}
|
||||
if req.path().starts_with("/v1.0") && headers.get("Authorization").is_none() {
|
||||
if args.hidden {
|
||||
return gree::not_found();
|
||||
return not_found(&req);
|
||||
} else {
|
||||
return webui::main(req);
|
||||
}
|
||||
}
|
||||
if req.method() == "POST" {
|
||||
match req.path() {
|
||||
"/v1.0/auth/initialize" => gree::initialize(req, body),
|
||||
"/v1.0/moderate/filtering/commit" => gree::moderate_commit(req, body),
|
||||
"/v1.0/auth/authorize" => gree::authorize(req, body),
|
||||
"/v1.0/migration/code/verify" => gree::migration_verify(req, body),
|
||||
"/v1.0/migration/password/register" => gree::migration_password_register(req, body),
|
||||
"/v1.0/migration" => gree::migration(req, body),
|
||||
"/api/webui/login" => webui::login(req, body),
|
||||
"/api/webui/startLoginbonus" => webui::start_loginbonus(req, body),
|
||||
"/api/webui/import" => webui::import(req, body),
|
||||
"/api/webui/set_time" => webui::set_time(req, body),
|
||||
"/api/webui/cheat" => webui::cheat(req, body),
|
||||
"/api/webui/grantPermission" => webui::grant_permission(req, body),
|
||||
"/api/webui/revokePermission" => webui::revoke_permission(req, body),
|
||||
_ => api_req(req, body).await
|
||||
}
|
||||
} else {
|
||||
match req.path() {
|
||||
"/v1.0/auth/x_uid" => gree::uid(req),
|
||||
"/v1.0/payment/productlist" => gree::payment(req),
|
||||
"/v1.0/payment/subscription/productlist" => gree::payment(req),
|
||||
"/v1.0/payment/ticket/status" => gree::payment_ticket(req),
|
||||
"/v1.0/moderate/keywordlist" => gree::moderate_keyword(req),
|
||||
"/v1.0/migration/code" => gree::migration_code(req),
|
||||
"/v1.0/payment/balance" => gree::balance(req),
|
||||
"/web/announcement" => web::announcement(req),
|
||||
"/api/webui/userInfo" => webui::user(req),
|
||||
"/live_clear_rate.html" => clear_rate::clearrate_html(req).await,
|
||||
"/webui/logout" => webui::logout(req),
|
||||
"/api/webui/export" => webui::export(req),
|
||||
"/api/webui/serverInfo" => webui::server_info(req),
|
||||
"/api/webui/listCards" => webui::get_card_info(req),
|
||||
"/api/webui/listMusic" => webui::get_music_info(req),
|
||||
"/api/webui/listLoginBonus" => webui::list_login_bonus(req),
|
||||
"/api/webui/listItems" => webui::list_items(req),
|
||||
"/api/webui/listPermissions" => webui::list_permissions(req),
|
||||
"/api/webui/listCharacters" => webui::list_characters(req),
|
||||
"/api/webui/listSkillCenters" => webui::list_skill_centers(req),
|
||||
"/api/webui/customCardLimits" => webui::custom_card_limits(req),
|
||||
"/api/webui/myScopes" => webui::my_scopes(req),
|
||||
_ => api_req(req, body).await
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn configure(cfg: &mut actix_web::web::ServiceConfig) {
|
||||
cfg.configure(crate::static_handlers::routes);
|
||||
cfg.service(
|
||||
actix_web::web::scope("/api")
|
||||
.service(
|
||||
actix_web::web::scope("")
|
||||
.wrap(from_fn(webui_fallback))
|
||||
.wrap(from_fn(asset_gate))
|
||||
// Split between user (claiming) and home (listing)
|
||||
.service(
|
||||
actix_web::web::resource("/gift")
|
||||
.route(actix_web::web::get().to(home::gift_get))
|
||||
.route(actix_web::web::post().to(user::gift))
|
||||
)
|
||||
.configure(card::routes)
|
||||
.configure(chat::routes)
|
||||
.configure(custom_song::routes)
|
||||
.configure(custom_card::routes)
|
||||
.configure(debug::routes)
|
||||
.configure(event::routes)
|
||||
.configure(exchange::routes)
|
||||
.configure(friend::routes)
|
||||
.configure(home::routes)
|
||||
.configure(items::routes)
|
||||
.configure(live::routes)
|
||||
.configure(location::routes)
|
||||
.configure(login::routes)
|
||||
.configure(lottery::routes)
|
||||
.configure(mission::routes)
|
||||
.configure(notice::routes)
|
||||
.configure(purchase::routes)
|
||||
.configure(serial_code::routes)
|
||||
.configure(shop::routes)
|
||||
.configure(start::routes)
|
||||
.configure(story::routes)
|
||||
.configure(tutorial::routes)
|
||||
.configure(user::routes)
|
||||
)
|
||||
);
|
||||
cfg.service(
|
||||
actix_web::web::scope("/v1.0")
|
||||
.configure(gree::routes)
|
||||
);
|
||||
cfg.configure(custom_song::web_routes);
|
||||
cfg.configure(custom_card::web_routes);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,73 @@
|
||||
use json::{object, array, JsonValue};
|
||||
use actix_web::{HttpRequest};
|
||||
use jzon::{object, array, JsonValue};
|
||||
use actix_web::{web, HttpRequest, Responder};
|
||||
|
||||
use crate::router::{userdata, global, items, databases};
|
||||
use crate::encryption;
|
||||
use crate::router::{global, userdata, items, databases, Session, Api};
|
||||
|
||||
pub fn routes(cfg: &mut web::ServiceConfig) {
|
||||
cfg.service(
|
||||
web::scope("/card")
|
||||
.route("/reinforce", web::post().to(reinforce))
|
||||
.route("/skill/reinforce", web::post().to(skill_reinforce))
|
||||
.route("/evolve", web::post().to(evolve))
|
||||
);
|
||||
}
|
||||
|
||||
// Custom cards live at id prefix 10000+ (imported 10000-14999, new 15000+).
|
||||
// Like custom songs they need a protocol version (global::PROTOCOL_HEADER):
|
||||
// clients below it can't resolve the ids
|
||||
pub const PROTOCOL_VERSION: u32 = 2;
|
||||
|
||||
pub fn is_custom(master_card_id: i64) -> bool {
|
||||
master_card_id >= 100_000_000
|
||||
}
|
||||
|
||||
pub fn client_supports_custom_cards(req: &HttpRequest) -> bool {
|
||||
global::client_protocol_version(req) >= PROTOCOL_VERSION
|
||||
}
|
||||
|
||||
pub fn account_supports_custom_cards(auth_key: &str) -> bool {
|
||||
userdata::get_protocol_version(auth_key) >= PROTOCOL_VERSION
|
||||
}
|
||||
|
||||
pub fn account_has_custom_cards(user: &JsonValue) -> bool {
|
||||
user["card_list"].members().any(|card| is_custom(card["master_card_id"].as_i64().unwrap_or(0)))
|
||||
}
|
||||
|
||||
// Card rows come through custom_card::card_info: the baked CARD_LIST for
|
||||
// official/imported ids, the custom-card db for the runtime band - a runtime
|
||||
// card has no CARD_LIST row and would otherwise cap at 0 here
|
||||
fn exp_cap(master_card_id: i64, evolved: bool) -> i64 {
|
||||
let card = crate::router::custom_card::card_info(master_card_id);
|
||||
let rarity = card["rarity"].to_string();
|
||||
let curve = card["masterCardLevelId"].as_i64().unwrap_or(0);
|
||||
let max_level = if evolved {
|
||||
databases::CARD_EVOLVE[&rarity]["maxLevel"].as_i64().unwrap_or(0)
|
||||
} else {
|
||||
databases::CARD_RARITY[&rarity]["maxLevel"].as_i64().unwrap_or(0)
|
||||
};
|
||||
databases::CARD_LEVEL[format!("{}_{}", curve, max_level)].as_i64().unwrap_or(i64::MAX)
|
||||
}
|
||||
|
||||
fn skill_exp_cap(master_card_id: i64) -> i64 {
|
||||
let card = crate::router::custom_card::card_info(master_card_id);
|
||||
let rarity = card["rarity"].to_string();
|
||||
let skill_curve = databases::CARD_RARITY[&rarity]["masterCardSkillLevelId"].to_string();
|
||||
databases::CARD_SKILL_MAX[skill_curve].as_i64().unwrap_or(i64::MAX)
|
||||
}
|
||||
|
||||
fn material_item_list(user: &JsonValue, body: &JsonValue) -> JsonValue {
|
||||
let mut rv = array![];
|
||||
for mat in body["material_item_list"].members() {
|
||||
let mid = mat["master_item_id"].as_i64();
|
||||
for it in user["item_list"].members() {
|
||||
if it["master_item_id"].as_i64() == mid {
|
||||
rv.push(it.clone()).unwrap();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
rv
|
||||
}
|
||||
|
||||
// Chats will only ever be used when evolving
|
||||
fn do_reinforce(user: &mut JsonValue, body: &JsonValue, exp_id: &str, money_multiplier: i64, evolve: bool, missions: &mut JsonValue, chats: &mut JsonValue, clear_mission_ids: &mut JsonValue) -> JsonValue {
|
||||
@@ -28,6 +93,18 @@ fn do_reinforce(user: &mut JsonValue, body: &JsonValue, exp_id: &str, money_mult
|
||||
}
|
||||
}
|
||||
|
||||
if exp_id == "exp" {
|
||||
let cap = exp_cap(card["master_card_id"].as_i64().unwrap(), !card["evolve"].is_empty());
|
||||
if card["exp"].as_i64().unwrap() > cap {
|
||||
card["exp"] = cap.into();
|
||||
}
|
||||
} else if exp_id == "skill_exp" {
|
||||
let cap = skill_exp_cap(card["master_card_id"].as_i64().unwrap());
|
||||
if card["skill_exp"].as_i64().unwrap() > cap {
|
||||
card["skill_exp"] = cap.into();
|
||||
}
|
||||
}
|
||||
|
||||
user["card_list"][i] = card.clone();
|
||||
|
||||
for data in user["point_list"].members_mut() {
|
||||
@@ -52,9 +129,7 @@ fn do_reinforce(user: &mut JsonValue, body: &JsonValue, exp_id: &str, money_mult
|
||||
object!{}
|
||||
}
|
||||
|
||||
pub fn reinforce(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
let key = global::get_login(req.headers(), &body);
|
||||
let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap();
|
||||
async fn reinforce(Session { key, body }: Session) -> impl Responder {
|
||||
let mut user = userdata::get_acc(&key);
|
||||
let mut clear_mission_ids = array![];
|
||||
|
||||
@@ -62,17 +137,15 @@ pub fn reinforce(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
|
||||
userdata::save_acc(&key, user.clone());
|
||||
|
||||
Some(object!{
|
||||
Api(Some(object!{
|
||||
card: card,
|
||||
item_list: user["item_list"].clone(),
|
||||
item_list: material_item_list(&user, &body),
|
||||
point_list: user["point_list"].clone(),
|
||||
clear_mission_ids: clear_mission_ids
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn skill_reinforce(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
let key = global::get_login(req.headers(), &body);
|
||||
let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap();
|
||||
async fn skill_reinforce(Session { key, body }: Session) -> impl Responder {
|
||||
let mut user = userdata::get_acc(&key);
|
||||
let mut clear_mission_ids = array![];
|
||||
|
||||
@@ -80,17 +153,15 @@ pub fn skill_reinforce(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
|
||||
userdata::save_acc(&key, user.clone());
|
||||
|
||||
Some(object!{
|
||||
Api(Some(object!{
|
||||
card: card,
|
||||
item_list: user["item_list"].clone(),
|
||||
item_list: material_item_list(&user, &body),
|
||||
point_list: user["point_list"].clone(),
|
||||
clear_mission_ids: clear_mission_ids
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn evolve(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
let key = global::get_login(req.headers(), &body);
|
||||
let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap();
|
||||
async fn evolve(Session { key, body }: Session) -> impl Responder {
|
||||
let mut user = userdata::get_acc(&key);
|
||||
let mut chats = userdata::get_acc_chats(&key);
|
||||
let mut missions = userdata::get_acc_missions(&key);
|
||||
@@ -102,10 +173,12 @@ pub fn evolve(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
userdata::save_acc_chats(&key, chats);
|
||||
userdata::save_acc_missions(&key, missions);
|
||||
|
||||
Some(object!{
|
||||
Api(Some(object!{
|
||||
card: card,
|
||||
item_list: user["item_list"].clone(),
|
||||
item_list: material_item_list(&user, &body),
|
||||
point_list: user["point_list"].clone(),
|
||||
clear_mission_ids: clear_mission_ids
|
||||
})
|
||||
clear_mission_ids: clear_mission_ids,
|
||||
gift_list: array![],
|
||||
updated_value_list: array![]
|
||||
}))
|
||||
}
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
use json::{object, array, JsonValue};
|
||||
use actix_web::{HttpRequest};
|
||||
use jzon::{object, array, JsonValue};
|
||||
use actix_web::{web, Responder};
|
||||
|
||||
use crate::router::{global, items, userdata, databases};
|
||||
use crate::encryption;
|
||||
use crate::router::{global, items, userdata, databases, Login, Session, Api};
|
||||
|
||||
pub fn routes(cfg: &mut web::ServiceConfig) {
|
||||
cfg.service(
|
||||
web::scope("/chat")
|
||||
.route("/home", web::post().to(home))
|
||||
.route("/talk/start", web::post().to(start))
|
||||
.route("/talk/end", web::post().to(end))
|
||||
);
|
||||
}
|
||||
|
||||
pub fn add_chat(id: i64, num: i64, chats: &mut JsonValue) -> bool {
|
||||
for data in chats.members() {
|
||||
@@ -29,8 +37,7 @@ pub fn add_chat_from_chapter_id(chapter_id: i64, chats: &mut JsonValue) -> bool
|
||||
add_chat(chapter["masterChatId"].as_i64().unwrap(), chapter["roomId"].as_i64().unwrap(), chats)
|
||||
}
|
||||
|
||||
pub fn home(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
let key = global::get_login(req.headers(), &body);
|
||||
async fn home(Login(key): Login) -> impl Responder {
|
||||
let chats = userdata::get_acc_chats(&key);
|
||||
|
||||
let mut rooms = array![];
|
||||
@@ -38,21 +45,19 @@ pub fn home(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
rooms.push(databases::CHATS[data["chat_id"].to_string()][data["room_id"].to_string()]["id"].clone()).unwrap();
|
||||
}
|
||||
|
||||
Some(object!{
|
||||
Api(Some(object!{
|
||||
"progress_list": chats,
|
||||
"master_chat_room_ids": rooms,
|
||||
"master_chat_stamp_ids": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,11001003,22001001,33001001,44001002],
|
||||
"master_chat_attachment_ids": []
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn start(_req: HttpRequest, _body: String) -> Option<JsonValue> {
|
||||
Some(object!{"select_talk_id_list":[],"get_item_list":[],"is_read":0})
|
||||
async fn start() -> impl Responder {
|
||||
Api(Some(object!{"select_talk_id_list":[],"get_item_list":[],"is_read":0}))
|
||||
}
|
||||
|
||||
pub fn end(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
let key = global::get_login(req.headers(), &body);
|
||||
let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap();
|
||||
async fn end(Session { key, body }: Session) -> impl Responder {
|
||||
let mut missions = userdata::get_acc_missions(&key);
|
||||
let mut chats = userdata::get_acc_chats(&key);
|
||||
|
||||
@@ -68,5 +73,5 @@ pub fn end(req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
}
|
||||
}
|
||||
|
||||
Some(array![])
|
||||
Api(Some(array![]))
|
||||
}
|
||||
|
||||
@@ -1,16 +1,41 @@
|
||||
use json::{object, array, JsonValue};
|
||||
use actix_web::{HttpRequest};
|
||||
use jzon::{array, object, JsonValue};
|
||||
use actix_web::{http::header::ContentType, HttpRequest, HttpResponse, Responder};
|
||||
use rusqlite::params;
|
||||
use std::sync::Mutex;
|
||||
use lazy_static::lazy_static;
|
||||
|
||||
use crate::encryption;
|
||||
use crate::sql::SQLite;
|
||||
use crate::router::{global, databases};
|
||||
use crate::router::{databases, global, userdata, Session, Api};
|
||||
use crate::include_file;
|
||||
use crate::router::tools::guest;
|
||||
|
||||
trait SqlClearRate {
|
||||
fn get_live_data(&self, id: i64) -> Result<Live, rusqlite::Error>;
|
||||
}
|
||||
impl SqlClearRate for SQLite {
|
||||
fn get_live_data(&self, id: i64) -> Result<Live, rusqlite::Error> {
|
||||
let conn = rusqlite::Connection::open(self.get_path()).unwrap();
|
||||
let mut stmt = conn.prepare("SELECT * FROM lives WHERE live_id=?1")?;
|
||||
stmt.query_row(params!(id), |row| {
|
||||
Ok(Live {
|
||||
live_id: row.get(0)?,
|
||||
normal_failed: row.get(1)?,
|
||||
normal_pass: row.get(2)?,
|
||||
hard_failed: row.get(3)?,
|
||||
hard_pass: row.get(4)?,
|
||||
expert_failed: row.get(5)?,
|
||||
expert_pass: row.get(6)?,
|
||||
master_failed: row.get(7)?,
|
||||
master_pass: row.get(8)?,
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref DATABASE: SQLite = SQLite::new("live_statistics.db", setup_tables);
|
||||
static ref CACHED_DATA: Mutex<Option<JsonValue>> = Mutex::new(None);
|
||||
static ref CACHED_HTML_DATA: Mutex<Option<JsonValue>> = Mutex::new(None);
|
||||
}
|
||||
|
||||
pub struct Live {
|
||||
@@ -25,8 +50,8 @@ pub struct Live {
|
||||
pub master_pass: i64,
|
||||
}
|
||||
|
||||
fn setup_tables(conn: &SQLite) {
|
||||
conn.lock_and_exec("CREATE TABLE IF NOT EXISTS lives (
|
||||
fn setup_tables(conn: &rusqlite::Connection) {
|
||||
conn.execute_batch("CREATE TABLE IF NOT EXISTS lives (
|
||||
live_id INT NOT NULL PRIMARY KEY,
|
||||
normal_failed BIGINT NOT NULL,
|
||||
normal_pass BIGINT NOT NULL,
|
||||
@@ -36,11 +61,11 @@ fn setup_tables(conn: &SQLite) {
|
||||
expert_pass BIGINT NOT NULL,
|
||||
master_failed BIGINT NOT NULL,
|
||||
master_pass BIGINT NOT NULL
|
||||
)", params!());
|
||||
conn.lock_and_exec("CREATE TABLE IF NOT EXISTS scores (
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS scores (
|
||||
live_id INT NOT NULL PRIMARY KEY,
|
||||
score_data TEXT NOT NULL
|
||||
)", params!());
|
||||
);").unwrap();
|
||||
}
|
||||
|
||||
fn update_live_score(id: i64, uid: i64, score: i64) {
|
||||
@@ -49,7 +74,7 @@ fn update_live_score(id: i64, uid: i64, score: i64) {
|
||||
}
|
||||
|
||||
let info = DATABASE.lock_and_select("SELECT score_data FROM scores WHERE live_id=?1", params!(id)).unwrap_or(String::from("[]"));
|
||||
let scores = json::parse(&info).unwrap();
|
||||
let scores = jzon::parse(&info).unwrap();
|
||||
|
||||
let mut result = array![];
|
||||
let mut current = 0;
|
||||
@@ -85,13 +110,25 @@ fn update_live_score(id: i64, uid: i64, score: i64) {
|
||||
|
||||
if added {
|
||||
if DATABASE.lock_and_select("SELECT live_id FROM scores WHERE live_id=?1", params!(id)).is_ok() {
|
||||
DATABASE.lock_and_exec("UPDATE scores SET score_data=?1 WHERE live_id=?2", params!(json::stringify(result), id));
|
||||
DATABASE.lock_and_exec("UPDATE scores SET score_data=?1 WHERE live_id=?2", params!(jzon::stringify(result), id));
|
||||
} else {
|
||||
DATABASE.lock_and_exec("INSERT INTO scores (score_data, live_id) VALUES (?1, ?2)", params!(json::stringify(result), id));
|
||||
DATABASE.lock_and_exec("INSERT INTO scores (score_data, live_id) VALUES (?1, ?2)", params!(jzon::stringify(result), id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Delete live id when custom song deleted
|
||||
pub fn purge_live(live_id: i64) {
|
||||
DATABASE.lock_and_exec("DELETE FROM lives WHERE live_id=?1", params!(live_id));
|
||||
DATABASE.lock_and_exec("DELETE FROM scores WHERE live_id=?1", params!(live_id));
|
||||
invalidate_cache();
|
||||
}
|
||||
|
||||
pub fn invalidate_cache() {
|
||||
crate::lock_onto_mutex!(CACHED_DATA).take();
|
||||
crate::lock_onto_mutex!(CACHED_HTML_DATA).take();
|
||||
}
|
||||
|
||||
pub fn live_completed(id: i64, level: i32, failed: bool, score: i64, uid: i64) {
|
||||
update_live_score(id, uid, score);
|
||||
match DATABASE.get_live_data(id) {
|
||||
@@ -127,6 +164,31 @@ pub fn live_completed(id: i64, level: i32, failed: bool, score: i64, uid: i64) {
|
||||
};
|
||||
}
|
||||
|
||||
fn get_song_title(live_id: i32, english: bool) -> String {
|
||||
let details = if english {
|
||||
databases::MUSIC_EN[live_id.to_string()].clone()
|
||||
} else {
|
||||
databases::MUSIC[live_id.to_string()].clone()
|
||||
};
|
||||
if !details.is_null() {
|
||||
return details["name"].to_string();
|
||||
}
|
||||
// Custom songs aren't in the official music mst (their live_id ==
|
||||
// music_id). PUBLIC ones show their real title; private/shared ones are
|
||||
// already filtered out of the page and would stay "Unknown Song" even if
|
||||
// one slipped through - the lookup only ever answers for public songs
|
||||
if let Some(title) = crate::router::custom_song::public_song_title(live_id as i64, english) {
|
||||
return title;
|
||||
}
|
||||
String::from("Unknown Song")
|
||||
}
|
||||
|
||||
// Titles land inside HTML text and attributes; custom song names are user
|
||||
// input, so escape them (official names contain nothing that needs it)
|
||||
fn html_escape(text: &str) -> String {
|
||||
text.replace('&', "&").replace('<', "<").replace('>', ">").replace('"', """)
|
||||
}
|
||||
|
||||
fn get_pass_percent(failed: i64, pass: i64) -> String {
|
||||
let total = (failed + pass) as f64;
|
||||
if failed + pass == 0 {
|
||||
@@ -153,7 +215,8 @@ fn get_json() -> JsonValue {
|
||||
expert: get_pass_percent(info.expert_failed, info.expert_pass),
|
||||
master: get_pass_percent(info.master_failed, info.master_pass)
|
||||
};
|
||||
ids.push(databases::LIVE_LIST[info.live_id.to_string()]["masterMusicId"].as_i64().unwrap()).unwrap();
|
||||
// Custom songs aren't in the official live mst; their live_id == music_id
|
||||
ids.push(databases::LIVE_LIST[info.live_id.to_string()]["masterMusicId"].as_i64().unwrap_or(info.live_id as i64)).unwrap();
|
||||
rates.push(to_push).unwrap();
|
||||
}
|
||||
object!{
|
||||
@@ -183,24 +246,53 @@ async fn get_clearrate_json() -> JsonValue {
|
||||
rv
|
||||
}
|
||||
|
||||
pub async fn clearrate(_req: HttpRequest) -> Option<JsonValue> {
|
||||
Some(get_clearrate_json().await)
|
||||
pub async fn clearrate(req: HttpRequest) -> impl Responder {
|
||||
let mut data = get_clearrate_json().await;
|
||||
let hidden = crate::router::custom_song::hidden_live_ids_for_user(global::get_uid(req.headers()));
|
||||
if !hidden.is_empty() {
|
||||
let rates = data["all_user_clear_rate"].clone();
|
||||
let ids = data["master_music_ids"].clone();
|
||||
let mut new_rates = array![];
|
||||
let mut new_ids = array![];
|
||||
for (i, rate) in rates.members().enumerate() {
|
||||
if hidden.contains(rate["master_live_id"].as_i64().unwrap()) {
|
||||
continue;
|
||||
}
|
||||
new_rates.push(rate.clone()).unwrap();
|
||||
new_ids.push(ids[i].clone()).unwrap();
|
||||
}
|
||||
data["all_user_clear_rate"] = new_rates;
|
||||
data["master_music_ids"] = new_ids;
|
||||
}
|
||||
Api(Some(data))
|
||||
}
|
||||
|
||||
pub fn ranking(_req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
let body = json::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap();
|
||||
pub async fn ranking(req: HttpRequest, Session { key, body }: Session) -> impl Responder {
|
||||
let protocol = crate::router::global::client_protocol_version(&req);
|
||||
let self_id = userdata::get_acc(&key)["user"]["id"].as_i64().unwrap();
|
||||
let live = body["master_live_id"].as_i64().unwrap();
|
||||
|
||||
let info = DATABASE.lock_and_select("SELECT score_data FROM scores WHERE live_id=?1", params!(live)).unwrap_or(String::from("[]"));
|
||||
let scores = json::parse(&info).unwrap();
|
||||
let scores = jzon::parse(&info).unwrap();
|
||||
|
||||
let mut rank = array![];
|
||||
|
||||
for (i, data) in scores.members().enumerate() {
|
||||
let user = global::get_user(data["user"].as_i64().unwrap(), &object![], false);
|
||||
let uid = data["user"].as_i64().unwrap();
|
||||
let user = guest::get_user(uid, &object![], guest::UserView::Ranking, protocol);
|
||||
let user_obj = if uid == self_id {
|
||||
// The client wants the fields get_user hides from other players
|
||||
let mut self_user = object!{
|
||||
user: userdata::get_acc_from_uid(uid)["user"].clone()
|
||||
};
|
||||
guest::proxy_user_cards(&mut self_user, protocol);
|
||||
self_user["user"].clone()
|
||||
} else {
|
||||
user["user"].clone()
|
||||
};
|
||||
rank.push(object!{
|
||||
rank: i + 1,
|
||||
user: user["user"].clone(),
|
||||
user: user_obj,
|
||||
score: data["score"].as_i64().unwrap(),
|
||||
favorite_card: user["favorite_card"].clone(),
|
||||
guest_smile_card: user["guest_smile_card"].clone(),
|
||||
@@ -209,7 +301,109 @@ pub fn ranking(_req: HttpRequest, body: String) -> Option<JsonValue> {
|
||||
}).unwrap();
|
||||
}
|
||||
|
||||
Some(object!{
|
||||
Api(Some(object!{
|
||||
"ranking_list": rank
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
||||
fn get_html() -> JsonValue {
|
||||
let lives = DATABASE.lock_and_select_all("SELECT live_id FROM lives", params!()).unwrap();
|
||||
let hidden = crate::router::custom_song::hidden_live_ids();
|
||||
|
||||
let mut table = String::new();
|
||||
|
||||
for id in lives.members() {
|
||||
let live_id = id.as_i64().unwrap();
|
||||
if hidden.contains(live_id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let info = match DATABASE.get_live_data(live_id) {
|
||||
Ok(i) => i,
|
||||
Err(_) => continue,
|
||||
};
|
||||
|
||||
let calc_rate = |pass: i64, fail: i64| -> f64 {
|
||||
let total = pass + fail;
|
||||
if total == 0 { 0.0 } else { pass as f64 / total as f64 }
|
||||
};
|
||||
|
||||
let title_jp = html_escape(&get_song_title(info.live_id, false));
|
||||
let title_en = html_escape(&get_song_title(info.live_id, true));
|
||||
|
||||
let normal_txt = get_pass_percent(info.normal_failed, info.normal_pass);
|
||||
let hard_txt = get_pass_percent(info.hard_failed, info.hard_pass);
|
||||
let expert_txt = get_pass_percent(info.expert_failed, info.expert_pass);
|
||||
let master_txt = get_pass_percent(info.master_failed, info.master_pass);
|
||||
|
||||
let normal_plays = info.normal_pass + info.normal_failed;
|
||||
let hard_plays = info.hard_pass + info.hard_failed;
|
||||
let expert_plays = info.expert_pass + info.expert_failed;
|
||||
let master_plays = info.master_pass + info.master_failed;
|
||||
|
||||
let normal_rate_sort = calc_rate(info.normal_pass, info.normal_failed);
|
||||
let hard_rate_sort = calc_rate(info.hard_pass, info.hard_failed);
|
||||
let expert_rate_sort = calc_rate(info.expert_pass, info.expert_failed);
|
||||
let master_rate_sort = calc_rate(info.master_pass, info.master_failed);
|
||||
|
||||
table.push_str(&format!(
|
||||
r#"<tr>
|
||||
<td class="title-cell"
|
||||
data-val="{title_jp}"
|
||||
data-title-en="{title_en}"
|
||||
data-title-jp="{title_jp}">
|
||||
{title_jp}
|
||||
</td>
|
||||
|
||||
<td data-plays="{normal_plays}" data-rate="{normal_rate_sort}">
|
||||
<span class="rate-text">{normal_txt}</span>
|
||||
<span class="meta-text">{normal_plays} plays</span>
|
||||
</td>
|
||||
|
||||
<td data-plays="{hard_plays}" data-rate="{hard_rate_sort}">
|
||||
<span class="rate-text">{hard_txt}</span>
|
||||
<span class="meta-text">{hard_plays} plays</span>
|
||||
</td>
|
||||
|
||||
<td data-plays="{expert_plays}" data-rate="{expert_rate_sort}">
|
||||
<span class="rate-text">{expert_txt}</span>
|
||||
<span class="meta-text">{expert_plays} plays</span>
|
||||
</td>
|
||||
|
||||
<td data-plays="{master_plays}" data-rate="{master_rate_sort}">
|
||||
<span class="rate-text">{master_txt}</span>
|
||||
<span class="meta-text">{master_plays} plays</span>
|
||||
</td>
|
||||
</tr>"#
|
||||
));
|
||||
}
|
||||
|
||||
let html = include_file!("src/router/clear_rate_template.html").replace("{{TABLEBODY}}", &table);
|
||||
object!{
|
||||
"cache": html,
|
||||
"last_updated": global::timestamp()
|
||||
}
|
||||
}
|
||||
|
||||
async fn get_clearrate_html() -> String {
|
||||
let cache = {
|
||||
let mut result = crate::lock_onto_mutex!(CACHED_HTML_DATA);
|
||||
if result.is_none() {
|
||||
result.replace(get_html());
|
||||
}
|
||||
result.as_ref().unwrap().clone()
|
||||
};
|
||||
if cache["last_updated"].as_u64().unwrap() + (60 * 60) < global::timestamp() {
|
||||
let mut result = crate::lock_onto_mutex!(CACHED_HTML_DATA);
|
||||
result.replace(get_html());
|
||||
}
|
||||
cache["cache"].to_string()
|
||||
}
|
||||
|
||||
pub async fn clearrate_html(_req: HttpRequest) -> HttpResponse {
|
||||
let html = get_clearrate_html().await;
|
||||
|
||||
HttpResponse::Ok()
|
||||
.content_type(ContentType::html())
|
||||
.body(html)
|
||||
}
|
||||
|
||||
239
src/router/clear_rate_template.html
Normal file
239
src/router/clear_rate_template.html
Normal file
@@ -0,0 +1,239 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Live Clear Rates</title>
|
||||
<style>
|
||||
:root {
|
||||
--bg-color: #f4f4f9;
|
||||
--text-color: #333;
|
||||
--table-bg: #ffffff;
|
||||
--primary-color: #6c5ce7;
|
||||
--primary-hover: #5649c0;
|
||||
--header-text: #ffffff;
|
||||
--border-color: #dddddd;
|
||||
--row-even: #f8f9fa;
|
||||
--row-hover: #eef2ff;
|
||||
--meta-text: #666;
|
||||
--shadow: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
body.dark-mode {
|
||||
--bg-color: #18181b;
|
||||
--text-color: #e4e4e7;
|
||||
--table-bg: #27272a;
|
||||
--primary-color: #818cf8;
|
||||
--primary-hover: #6366f1;
|
||||
--header-text: #ffffff;
|
||||
--border-color: #3f3f46;
|
||||
--row-even: #2f2f35;
|
||||
--row-hover: #353540;
|
||||
--meta-text: #a1a1aa;
|
||||
--shadow: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
background-color: var(--bg-color);
|
||||
color: var(--text-color);
|
||||
padding: 20px;
|
||||
transition: background-color 0.3s, color 0.3s;
|
||||
}
|
||||
|
||||
h1 { text-align: center; margin-bottom: 20px; }
|
||||
|
||||
.controls {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 15px;
|
||||
margin-bottom: 20px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.btn {
|
||||
padding: 8px 16px;
|
||||
border: 2px solid var(--primary-color);
|
||||
background: transparent;
|
||||
color: var(--text-color);
|
||||
border-radius: 20px;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
transition: 0.2s;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.btn:hover, .btn.active {
|
||||
background-color: var(--primary-color);
|
||||
color: var(--header-text);
|
||||
}
|
||||
|
||||
.table-container {
|
||||
overflow-x: auto;
|
||||
box-shadow: 0 0 20px var(--shadow);
|
||||
border-radius: 8px;
|
||||
background: var(--table-bg);
|
||||
}
|
||||
|
||||
table { width: 100%; border-collapse: collapse; min-width: 600px; }
|
||||
|
||||
th, td {
|
||||
padding: 12px 15px;
|
||||
text-align: center;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
th {
|
||||
background-color: var(--primary-color);
|
||||
color: var(--header-text);
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
th:hover { background-color: var(--primary-hover); }
|
||||
|
||||
tr:nth-of-type(even) { background-color: var(--row-even); }
|
||||
tr:last-of-type { border-bottom: 2px solid var(--primary-color); }
|
||||
tr:hover { background-color: var(--row-hover); transition: 0.2s; }
|
||||
|
||||
th::after { content: ' \2195'; opacity: 0.3; font-size: 0.8em; margin-left: 5px; }
|
||||
th.asc::after { content: ' \2191'; opacity: 1; }
|
||||
th.desc::after { content: ' \2193'; opacity: 1; }
|
||||
|
||||
.meta-text { font-size: 0.85em; color: var(--meta-text); display: block; margin-top: 4px; }
|
||||
.rate-text { font-weight: bold; font-size: 1.1em; }
|
||||
.title-cell { text-align: left; font-weight: 600; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Live Clear Rates</h1>
|
||||
|
||||
<div class="controls">
|
||||
<button class="btn" id="btnLang" onclick="toggleLanguage()">Language: JP</button>
|
||||
|
||||
<button class="btn active" id="btnPlays" onclick="setSortMode('plays')">Sort by Plays</button>
|
||||
<button class="btn" id="btnRate" onclick="setSortMode('rate')">Sort by Rate %</button>
|
||||
<button class="btn" onclick="toggleTheme()">Dark Mode 🌓</button>
|
||||
</div>
|
||||
|
||||
<div class="table-container">
|
||||
<table id="rateTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th onclick="sortTable(0)">Song Title</th>
|
||||
<th onclick="sortTable(1)">Normal</th>
|
||||
<th onclick="sortTable(2)">Hard</th>
|
||||
<th onclick="sortTable(3)">Expert</th>
|
||||
<th onclick="sortTable(4)">Master</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{TABLEBODY}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let currentSortMode = 'plays';
|
||||
let currentLang = localStorage.getItem('lang') || 'jp';
|
||||
|
||||
updateLanguageDisplay();
|
||||
|
||||
function toggleTheme() {
|
||||
document.body.classList.toggle('dark-mode');
|
||||
const isDark = document.body.classList.contains('dark-mode');
|
||||
localStorage.setItem('theme', isDark ? 'dark' : 'light');
|
||||
}
|
||||
|
||||
if (localStorage.getItem('theme') === 'dark') {
|
||||
document.body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
function toggleLanguage() {
|
||||
currentLang = currentLang === 'jp' ? 'en' : 'jp';
|
||||
localStorage.setItem('lang', currentLang);
|
||||
updateLanguageDisplay();
|
||||
}
|
||||
|
||||
function updateLanguageDisplay() {
|
||||
const btn = document.getElementById('btnLang');
|
||||
btn.innerText = 'Language: ' + (currentLang === 'jp' ? 'JP' : 'EN');
|
||||
|
||||
const titleCells = document.querySelectorAll('.title-cell');
|
||||
|
||||
titleCells.forEach(td => {
|
||||
const newTitle = td.getAttribute(`data-title-${currentLang}`);
|
||||
|
||||
if (newTitle) {
|
||||
td.innerText = newTitle;
|
||||
td.setAttribute('data-val', newTitle);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function setSortMode(mode) {
|
||||
currentSortMode = mode;
|
||||
|
||||
document.getElementById('btnPlays').classList.toggle('active', mode === 'plays');
|
||||
document.getElementById('btnRate').classList.toggle('active', mode === 'rate');
|
||||
}
|
||||
|
||||
function sortTable(n) {
|
||||
var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
|
||||
table = document.getElementById("rateTable");
|
||||
switching = true;
|
||||
dir = "desc";
|
||||
|
||||
var headers = table.getElementsByTagName("TH");
|
||||
for (var h of headers) { h.classList.remove("asc", "desc"); }
|
||||
|
||||
while (switching) {
|
||||
switching = false;
|
||||
rows = table.rows;
|
||||
for (i = 1; i < (rows.length - 1); i++) {
|
||||
shouldSwitch = false;
|
||||
x = rows[i].getElementsByTagName("TD")[n];
|
||||
y = rows[i + 1].getElementsByTagName("TD")[n];
|
||||
|
||||
let attrName = (n === 0) ? 'data-val' : (currentSortMode === 'plays' ? 'data-plays' : 'data-rate');
|
||||
|
||||
var xVal = x.getAttribute(attrName);
|
||||
var yVal = y.getAttribute(attrName);
|
||||
|
||||
var xNum = parseFloat(xVal);
|
||||
var yNum = parseFloat(yVal);
|
||||
|
||||
if (!isNaN(xNum) && !isNaN(yNum)) {
|
||||
if (dir == "asc") {
|
||||
if (xNum > yNum) { shouldSwitch = true; break; }
|
||||
} else if (dir == "desc") {
|
||||
if (xNum < yNum) { shouldSwitch = true; break; }
|
||||
}
|
||||
} else {
|
||||
// String sorting (for titles)
|
||||
if (dir == "asc") {
|
||||
if (xVal.toLowerCase() > yVal.toLowerCase()) { shouldSwitch = true; break; }
|
||||
} else if (dir == "desc") {
|
||||
if (xVal.toLowerCase() < yVal.toLowerCase()) { shouldSwitch = true; break; }
|
||||
}
|
||||
}
|
||||
}
|
||||
if (shouldSwitch) {
|
||||
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
|
||||
switching = true;
|
||||
switchcount ++;
|
||||
} else {
|
||||
if (switchcount == 0 && dir == "desc") {
|
||||
dir = "asc";
|
||||
switching = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
headers[n].classList.add(dir);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
2277
src/router/custom_card.rs
Normal file
2277
src/router/custom_card.rs
Normal file
File diff suppressed because it is too large
Load Diff
321
src/router/custom_card/art.rs
Normal file
321
src/router/custom_card/art.rs
Normal file
@@ -0,0 +1,321 @@
|
||||
// Art derivation for custom cards: every in-game kind is generated from one
|
||||
// source artwork per variant, replicating the SIF1-import pipeline that built
|
||||
// the 7 kinds for all 4,002 imported cards
|
||||
// (sif1-cards/pipeline/07_prototype.py + 08_convert_all.py + 15_memoria_art.py
|
||||
// + 17_skillcutin_art.py + 18_blank_art_fallback.py). Uploads are never
|
||||
// rejected for dimensions: sources and per-kind overrides alike are
|
||||
// center-crop-covered and Lanczos3-resampled to the exact target sizes, and
|
||||
// the stored/hashed bytes are always the processed PNG output.
|
||||
//
|
||||
// Two source treatments, matching the pipeline's two art classes:
|
||||
// * a TRANSPARENT cutout (SIF1 "navi" standee art): the figure (alpha bbox)
|
||||
// is placed on the official c_/h_ canvas geometry (fit 1700x1180, centred
|
||||
// on 2048x1260) over a blurred+darkened backdrop made from the art itself;
|
||||
// m_/sc_/p_/r_ are the pipeline's figure-proportional crops.
|
||||
// * OPAQUE artwork: landscape art covers the c_ canvas directly; portrait art
|
||||
// gets the blurred-backdrop presentation with the whole image centred.
|
||||
// h_ falls back to the c_ content and m_ to its top square, exactly the
|
||||
// fallback semantics 18_blank_art_fallback.py shipped for the 74 SIF1
|
||||
// cards with no transparent standee.
|
||||
|
||||
use image::{imageops, DynamicImage, Rgba, RgbaImage};
|
||||
|
||||
// Permissive sanity floor: upscaling small-ish sources is allowed, only
|
||||
// absurd inputs are refused
|
||||
pub const MIN_SOURCE_DIM: u32 = 100;
|
||||
|
||||
// c_/h_ canvas and the navi fit box (make_full_illust / place_navi)
|
||||
const CANVAS_W: u32 = 2048;
|
||||
const CANVAS_H: u32 = 1260;
|
||||
const FIT_W: f64 = 1700.0;
|
||||
const FIT_H: f64 = 1180.0;
|
||||
const BRIGHTNESS: f64 = 0.88;
|
||||
// GaussianBlur(24) @ 2048x1260 == GaussianBlur(6) @ 512x315 upscaled (the
|
||||
// pipeline used the same half-res trick for speed)
|
||||
const BLUR_W: u32 = 512;
|
||||
const BLUR_H: u32 = 315;
|
||||
const BLUR_SIGMA: f32 = 6.0;
|
||||
|
||||
// m_: head-anchored square of the placed figure (15_memoria_art.py, fitted
|
||||
// against official pairs at alpha-IoU 0.89-0.94)
|
||||
const M_SIDE: f64 = 0.78; // of figure height
|
||||
const M_TOP: f64 = 0.03; // top edge this far ABOVE the figure top
|
||||
|
||||
// sc_: bust crop (17_skillcutin_art.py, fitted at alpha-IoU 0.84-0.92)
|
||||
const SC_CROP_H: f64 = 0.68; // of figure height
|
||||
const SC_CROP_TOP: f64 = -0.055; // of figure height, relative to figure top
|
||||
|
||||
pub fn decode_source(name: &str, bytes: &[u8]) -> Result<DynamicImage, String> {
|
||||
let img = image::load_from_memory(bytes)
|
||||
.map_err(|_| format!("'{}' is not a decodable image (png, jpg and webp work)", name))?;
|
||||
if img.width() < MIN_SOURCE_DIM || img.height() < MIN_SOURCE_DIM {
|
||||
return Err(format!("'{}' is only {}x{} - at least {}x{} is required", name, img.width(), img.height(), MIN_SOURCE_DIM, MIN_SOURCE_DIM));
|
||||
}
|
||||
Ok(img)
|
||||
}
|
||||
|
||||
pub fn encode_png(img: &RgbaImage) -> Result<Vec<u8>, String> {
|
||||
let mut rv = Vec::new();
|
||||
DynamicImage::ImageRgba8(img.clone())
|
||||
.write_to(&mut std::io::Cursor::new(&mut rv), image::ImageFormat::Png)
|
||||
.map_err(|e| e.to_string())?;
|
||||
Ok(rv)
|
||||
}
|
||||
|
||||
fn resize(img: &RgbaImage, w: u32, h: u32) -> RgbaImage {
|
||||
imageops::resize(img, w.max(1), h.max(1), imageops::FilterType::Lanczos3)
|
||||
}
|
||||
|
||||
// Scale-to-cover + centre-crop: the aspect-mismatch treatment for every
|
||||
// override and for opaque landscape sources (the pipeline's cover())
|
||||
pub fn cover(img: &RgbaImage, tw: u32, th: u32) -> RgbaImage {
|
||||
let scale = f64::max(tw as f64 / img.width() as f64, th as f64 / img.height() as f64);
|
||||
let scaled = resize(img, (img.width() as f64 * scale).round() as u32, (img.height() as f64 * scale).round() as u32);
|
||||
let x = (scaled.width() - tw.min(scaled.width())) / 2;
|
||||
let y = (scaled.height() - th.min(scaled.height())) / 2;
|
||||
imageops::crop_imm(&scaled, x, y, tw, th).to_image()
|
||||
}
|
||||
|
||||
// The bounding box of the non-transparent pixels
|
||||
fn alpha_bbox(img: &RgbaImage) -> Option<(u32, u32, u32, u32)> {
|
||||
let (mut x0, mut y0, mut x1, mut y1) = (u32::MAX, u32::MAX, 0u32, 0u32);
|
||||
for (x, y, px) in img.enumerate_pixels() {
|
||||
if px[3] > 0 {
|
||||
x0 = x0.min(x);
|
||||
y0 = y0.min(y);
|
||||
x1 = x1.max(x);
|
||||
y1 = y1.max(y);
|
||||
}
|
||||
}
|
||||
if x0 == u32::MAX {
|
||||
None
|
||||
} else {
|
||||
Some((x0, y0, x1 + 1, y1 + 1))
|
||||
}
|
||||
}
|
||||
|
||||
// A source counts as a transparent cutout (SIF1 navi-style standee) when a
|
||||
// meaningful share of it is fully transparent background
|
||||
fn is_cutout(img: &RgbaImage) -> bool {
|
||||
let total = (img.width() as u64) * (img.height() as u64);
|
||||
let transparent = img.pixels().filter(|px| px[3] < 16).count() as u64;
|
||||
transparent * 100 / total.max(1) >= 5
|
||||
}
|
||||
|
||||
// Multiplicative darken (PIL ImageEnhance.Brightness)
|
||||
fn darken(img: &mut RgbaImage, factor: f64) {
|
||||
for px in img.pixels_mut() {
|
||||
for c in 0..3 {
|
||||
px[c] = (px[c] as f64 * factor).round().min(255.0) as u8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Crop that pads with transparency outside the source (PIL crop() semantics),
|
||||
// so figure-proportional crops can reach past the figure
|
||||
fn crop_pad(src: &RgbaImage, x0: i64, y0: i64, w: u32, h: u32) -> RgbaImage {
|
||||
let mut canvas = RgbaImage::from_pixel(w, h, Rgba([0, 0, 0, 0]));
|
||||
let sx = x0.max(0) as u32;
|
||||
let sy = y0.max(0) as u32;
|
||||
if sx < src.width() && sy < src.height() {
|
||||
let cw = (src.width() - sx).min((x0 + w as i64 - sx as i64).max(0) as u32);
|
||||
let ch = (src.height() - sy).min((y0 + h as i64 - sy as i64).max(0) as u32);
|
||||
if cw > 0 && ch > 0 {
|
||||
let piece = imageops::crop_imm(src, sx, sy, cw, ch).to_image();
|
||||
imageops::overlay(&mut canvas, &piece, (sx as i64 - x0).max(0), (sy as i64 - y0).max(0));
|
||||
}
|
||||
}
|
||||
canvas
|
||||
}
|
||||
|
||||
// The blurred + darkened backdrop the c_ presentation puts behind portrait /
|
||||
// cutout art, made from the art itself (the import used the SIF1 card
|
||||
// background here; a runtime upload has no separate background, and the
|
||||
// art-as-its-own-backdrop is the same trick the custom-song jacket blur uses)
|
||||
fn blurred_backdrop(source: &RgbaImage) -> RgbaImage {
|
||||
let mut flat = flatten(source);
|
||||
flat = cover(&flat, BLUR_W, BLUR_H);
|
||||
flat = imageops::blur(&flat, BLUR_SIGMA);
|
||||
darken(&mut flat, BRIGHTNESS);
|
||||
resize(&flat, CANVAS_W, CANVAS_H)
|
||||
}
|
||||
|
||||
// Flatten transparency onto the mean colour of the opaque pixels (the
|
||||
// pipeline flattened onto the tile's centre colour; a cutout's centre may be
|
||||
// transparent, so the figure's own average is the stable equivalent)
|
||||
fn flatten(img: &RgbaImage) -> RgbaImage {
|
||||
let (mut r, mut g, mut b, mut n) = (0u64, 0u64, 0u64, 0u64);
|
||||
for px in img.pixels() {
|
||||
if px[3] >= 128 {
|
||||
r += px[0] as u64;
|
||||
g += px[1] as u64;
|
||||
b += px[2] as u64;
|
||||
n += 1;
|
||||
}
|
||||
}
|
||||
let base = if n > 0 {
|
||||
Rgba([(r / n) as u8, (g / n) as u8, (b / n) as u8, 255])
|
||||
} else {
|
||||
Rgba([240, 240, 240, 255])
|
||||
};
|
||||
let mut canvas = RgbaImage::from_pixel(img.width(), img.height(), base);
|
||||
imageops::overlay(&mut canvas, img, 0, 0);
|
||||
canvas
|
||||
}
|
||||
|
||||
// place_navi: the figure scaled into the 1700x1180 fit box, and its placement
|
||||
// on the 2048x1260 canvas
|
||||
fn place_figure(figure: &RgbaImage) -> (RgbaImage, i64, i64) {
|
||||
let scale = f64::min(FIT_H / figure.height() as f64, FIT_W / figure.width() as f64);
|
||||
let placed = resize(figure, (figure.width() as f64 * scale).round() as u32, (figure.height() as f64 * scale).round() as u32);
|
||||
let x = (CANVAS_W as i64 - placed.width() as i64) / 2;
|
||||
let y = (CANVAS_H as i64 - placed.height() as i64) / 2;
|
||||
(placed, x, y)
|
||||
}
|
||||
|
||||
// p_: the 136x508 vertical strip through the figure's centre column
|
||||
fn portrait_strip(figure: &RgbaImage) -> RgbaImage {
|
||||
let scaled = resize(figure, ((figure.width() as f64 * 508.0 / figure.height() as f64).round() as u32).max(1), 508);
|
||||
let cx = scaled.width() as i64 / 2;
|
||||
crop_pad(&scaled, cx - 68, 0, 136, 508)
|
||||
}
|
||||
|
||||
// m_/r_: head-anchored square of the figure (side 0.78 * height, top edge
|
||||
// 0.03 * height above the figure)
|
||||
fn head_square(figure: &RgbaImage) -> RgbaImage {
|
||||
let h = figure.height() as f64;
|
||||
let side = (h * M_SIDE).round().max(1.0) as u32;
|
||||
let ox = (figure.width() as i64 - side as i64) / 2;
|
||||
let oy = -(h * M_TOP).round() as i64;
|
||||
crop_pad(figure, ox, oy, side, side)
|
||||
}
|
||||
|
||||
// sc_: the 2:1 bust crop, bottom edge running off the figure
|
||||
fn bust_crop(figure: &RgbaImage) -> RgbaImage {
|
||||
let fh = figure.height() as f64;
|
||||
let ch = (fh * SC_CROP_H).round().max(1.0) as u32;
|
||||
let cw = ch * 2;
|
||||
let x0 = figure.width() as i64 / 2 - cw as i64 / 2;
|
||||
let y0 = (fh * SC_CROP_TOP).round() as i64;
|
||||
resize(&crop_pad(figure, x0, y0, cw, ch), 1024, 512)
|
||||
}
|
||||
|
||||
// All 7 card kinds from one source artwork. Every output is at the exact
|
||||
// official size; the caller overlays any explicit per-kind overrides
|
||||
pub fn derive_card_art(source: &DynamicImage) -> Vec<(&'static str, RgbaImage)> {
|
||||
let rgba = source.to_rgba8();
|
||||
let cutout = is_cutout(&rgba).then(|| alpha_bbox(&rgba)).flatten();
|
||||
|
||||
let (c, h, figure) = if let Some((x0, y0, x1, y1)) = cutout {
|
||||
// Transparent standee: the official composition
|
||||
let figure = imageops::crop_imm(&rgba, x0, y0, x1 - x0, y1 - y0).to_image();
|
||||
let (placed, px, py) = place_figure(&figure);
|
||||
let mut c = blurred_backdrop(&rgba);
|
||||
imageops::overlay(&mut c, &placed, px, py);
|
||||
let mut h = RgbaImage::from_pixel(CANVAS_W, CANVAS_H, Rgba([0, 0, 0, 0]));
|
||||
imageops::overlay(&mut h, &placed, px, py);
|
||||
(c, h, figure)
|
||||
} else {
|
||||
// Opaque artwork: landscape covers the canvas, portrait gets the
|
||||
// blurred-backdrop presentation; h_ falls back to the c_ content
|
||||
let c = if rgba.height() > rgba.width() {
|
||||
let (placed, px, py) = place_figure(&rgba);
|
||||
let mut c = blurred_backdrop(&rgba);
|
||||
imageops::overlay(&mut c, &placed, px, py);
|
||||
c
|
||||
} else {
|
||||
cover(&rgba, CANVAS_W, CANVAS_H)
|
||||
};
|
||||
(c.clone(), c, rgba)
|
||||
};
|
||||
|
||||
let t = resize(&c, 512, 315);
|
||||
let m = resize(&head_square(&figure), 380, 380);
|
||||
let r = resize(&head_square(&figure), 256, 256);
|
||||
let sc = bust_crop(&figure);
|
||||
let p = portrait_strip(&figure);
|
||||
|
||||
vec![("c", c), ("h", h), ("t", t), ("p", p), ("r", r), ("m", m), ("sc", sc)]
|
||||
}
|
||||
|
||||
// Character icon derived from the portrait when no explicit icon is supplied:
|
||||
// a top-anchored square for portrait sources (the face is up there), centred
|
||||
// for landscape ones
|
||||
pub fn derive_character_icon(portrait: &DynamicImage) -> RgbaImage {
|
||||
let rgba = portrait.to_rgba8();
|
||||
let side = rgba.width().min(rgba.height());
|
||||
let x0 = (rgba.width() - side) / 2;
|
||||
let y0 = if rgba.height() > rgba.width() { 0 } else { (rgba.height() - side) / 2 };
|
||||
resize(&imageops::crop_imm(&rgba, x0, y0, side, side).to_image(), 230, 230)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn cutout_source(w: u32, h: u32) -> DynamicImage {
|
||||
// A transparent canvas with an opaque figure occupying the middle band
|
||||
let mut img = RgbaImage::from_pixel(w, h, Rgba([0, 0, 0, 0]));
|
||||
for y in h / 8..h * 7 / 8 {
|
||||
for x in w / 3..w * 2 / 3 {
|
||||
img.put_pixel(x, y, Rgba([200, 60, 120, 255]));
|
||||
}
|
||||
}
|
||||
DynamicImage::ImageRgba8(img)
|
||||
}
|
||||
|
||||
fn opaque_source(w: u32, h: u32) -> DynamicImage {
|
||||
DynamicImage::ImageRgba8(RgbaImage::from_fn(w, h, |x, y| {
|
||||
Rgba([(x % 256) as u8, (y % 256) as u8, 99, 255])
|
||||
}))
|
||||
}
|
||||
|
||||
const TARGETS: &[(&str, u32, u32)] = &[
|
||||
("c", 2048, 1260), ("h", 2048, 1260), ("t", 512, 315), ("p", 136, 508),
|
||||
("r", 256, 256), ("m", 380, 380), ("sc", 1024, 512)
|
||||
];
|
||||
|
||||
// Odd-sized sources in -> every kind at its exact official size out,
|
||||
// through both the cutout and the opaque path, portrait and landscape
|
||||
#[test]
|
||||
fn derivation_hits_exact_target_dims() {
|
||||
for source in [cutout_source(437, 1013), opaque_source(437, 1013), opaque_source(1900, 700), opaque_source(300, 300)] {
|
||||
let derived = derive_card_art(&source);
|
||||
assert_eq!(derived.len(), 7);
|
||||
for (kind, img) in derived {
|
||||
let target = TARGETS.iter().find(|(k, _, _)| *k == kind).unwrap();
|
||||
assert_eq!((img.width(), img.height()), (target.1, target.2), "kind {}", kind);
|
||||
}
|
||||
}
|
||||
let icon = derive_character_icon(&opaque_source(431, 617));
|
||||
assert_eq!((icon.width(), icon.height()), (230, 230));
|
||||
}
|
||||
|
||||
// A transparent standee gets a transparent h_ aligned with c_; an opaque
|
||||
// source falls back to h_ == c_ (18_blank_art_fallback semantics)
|
||||
#[test]
|
||||
fn cutouts_and_opaque_sources_take_their_own_lanes() {
|
||||
let derived = derive_card_art(&cutout_source(800, 1000));
|
||||
let h = &derived.iter().find(|(k, _)| *k == "h").unwrap().1;
|
||||
assert!(h.pixels().any(|px| px[3] == 0), "cutout h_ keeps transparency");
|
||||
let c = &derived.iter().find(|(k, _)| *k == "c").unwrap().1;
|
||||
assert!(c.pixels().all(|px| px[3] == 255), "c_ backdrop is opaque");
|
||||
|
||||
let derived = derive_card_art(&opaque_source(800, 1000));
|
||||
let h = &derived.iter().find(|(k, _)| *k == "h").unwrap().1;
|
||||
let c = &derived.iter().find(|(k, _)| *k == "c").unwrap().1;
|
||||
assert_eq!(h.as_raw(), c.as_raw(), "opaque h_ falls back to c_");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn cover_crops_to_aspect_and_floor_rejects_tiny_sources() {
|
||||
let img = opaque_source(1000, 400).to_rgba8();
|
||||
let out = cover(&img, 512, 315);
|
||||
assert_eq!((out.width(), out.height()), (512, 315));
|
||||
|
||||
let mut tiny = Vec::new();
|
||||
opaque_source(32, 32).write_to(&mut std::io::Cursor::new(&mut tiny), image::ImageFormat::Png).unwrap();
|
||||
assert!(decode_source("art_00", &tiny).unwrap_err().contains("at least"));
|
||||
assert!(decode_source("art_00", b"garbage").unwrap_err().contains("not a decodable image"));
|
||||
}
|
||||
}
|
||||
2068
src/router/custom_song.rs
Normal file
2068
src/router/custom_song.rs
Normal file
File diff suppressed because it is too large
Load Diff
202
src/router/custom_song/audio.rs
Normal file
202
src/router/custom_song/audio.rs
Normal file
@@ -0,0 +1,202 @@
|
||||
use std::num::{NonZeroU8, NonZeroU32};
|
||||
use symphonia::core::codecs::CodecParameters;
|
||||
use symphonia::core::codecs::audio::AudioDecoderOptions;
|
||||
use symphonia::core::errors::Error as SymphoniaError;
|
||||
use symphonia::core::formats::TrackType;
|
||||
use symphonia::core::formats::probe::Hint;
|
||||
use symphonia::core::io::MediaSourceStream;
|
||||
use vorbis_rs::{VorbisBitrateManagementStrategy, VorbisEncoderBuilder};
|
||||
|
||||
use super::{DEFAULT_PREVIEW_LENGTH_SEC, PREVIEW_FADE_SEC};
|
||||
|
||||
// The whole audio pipeline runs in-process: symphonia (pure Rust) decodes and
|
||||
// validates uploads, vorbis_rs (libvorbis compiled into the binary - a library
|
||||
// call, like rusqlite's bundled sqlite) encodes. No external processes are
|
||||
// ever spawned and nothing needs to be on PATH.
|
||||
//
|
||||
// - ogg-vorbis uploads are stored AS-IS once they prove decodable, so the
|
||||
// served play cue's md5 is stable across servers (export/import keeps it)
|
||||
// - mp3/wav uploads are transcoded to ogg-vorbis once, at upload time
|
||||
// - the select cue (menu preview) is cut + faded in samples and re-encoded
|
||||
// Encodes keep the source sample rate and use a fixed Ogg stream serial, so
|
||||
// they're deterministic: the same input always produces the same bytes
|
||||
|
||||
pub struct Cue {
|
||||
pub bytes: Vec<u8>,
|
||||
pub md5: String,
|
||||
pub duration_sec: f64
|
||||
}
|
||||
|
||||
// ~ffmpeg's -q:a 6
|
||||
const ENCODE_QUALITY: f32 = 0.6;
|
||||
// "SIF2" - fixed so encoding is deterministic
|
||||
const STREAM_SERIAL: i32 = 0x53494632;
|
||||
const ENCODE_BLOCK_FRAMES: usize = 65536;
|
||||
|
||||
struct DecodedAudio {
|
||||
// Planar f32, one Vec per channel. Channels past the first two are dropped
|
||||
channels: Vec<Vec<f32>>,
|
||||
sample_rate: u32
|
||||
}
|
||||
|
||||
impl DecodedAudio {
|
||||
fn frames(&self) -> usize {
|
||||
self.channels[0].len()
|
||||
}
|
||||
fn duration(&self) -> f64 {
|
||||
self.frames() as f64 / self.sample_rate as f64
|
||||
}
|
||||
}
|
||||
|
||||
fn is_ogg_vorbis(bytes: &[u8]) -> bool {
|
||||
// "OggS" capture pattern + the "\x01vorbis" identification header on the first page
|
||||
bytes.starts_with(b"OggS") && bytes.len() > 64 && bytes[..64].windows(7).any(|w| w == b"\x01vorbis")
|
||||
}
|
||||
|
||||
fn decode(bytes: &[u8]) -> Result<DecodedAudio, String> {
|
||||
let stream = MediaSourceStream::new(Box::new(std::io::Cursor::new(bytes.to_vec())), Default::default());
|
||||
let mut format = symphonia::default::get_probe()
|
||||
.probe(&Hint::new(), stream, Default::default(), Default::default())
|
||||
.map_err(|_| String::from("Could not read audio file (expected ogg vorbis, mp3 or wav)"))?;
|
||||
|
||||
let track = format.default_track(TrackType::Audio).ok_or(String::from("Audio file has no audio track"))?;
|
||||
let track_id = track.id;
|
||||
let Some(CodecParameters::Audio(params)) = track.codec_params.clone() else {
|
||||
return Err(String::from("Audio file has no audio track"));
|
||||
};
|
||||
let mut decoder = symphonia::default::get_codecs()
|
||||
.make_audio_decoder(¶ms, &AudioDecoderOptions::default())
|
||||
.map_err(|_| String::from("Could not read audio file (expected ogg vorbis, mp3 or wav)"))?;
|
||||
|
||||
let mut channels: Vec<Vec<f32>> = Vec::new();
|
||||
let mut sample_rate = 0;
|
||||
let mut interleaved: Vec<f32> = Vec::new();
|
||||
loop {
|
||||
let packet = match format.next_packet() {
|
||||
Ok(Some(packet)) => packet,
|
||||
Ok(None) => break,
|
||||
Err(SymphoniaError::ResetRequired) => break,
|
||||
Err(_) => return Err(String::from("Audio file is corrupt or truncated"))
|
||||
};
|
||||
if packet.track_id != track_id {
|
||||
continue;
|
||||
}
|
||||
let decoded = match decoder.decode(&packet) {
|
||||
Ok(decoded) => decoded,
|
||||
// Decoders treat a bad packet as recoverable; skip it like they do
|
||||
Err(SymphoniaError::DecodeError(_)) => continue,
|
||||
Err(_) => return Err(String::from("Audio file is corrupt or truncated"))
|
||||
};
|
||||
let count = decoded.spec().channels().count();
|
||||
if channels.is_empty() {
|
||||
sample_rate = decoded.spec().rate();
|
||||
channels = vec![Vec::new(); std::cmp::min(count, 2)];
|
||||
}
|
||||
decoded.copy_to_vec_interleaved(&mut interleaved);
|
||||
for (i, samples) in channels.iter_mut().enumerate() {
|
||||
samples.extend(interleaved.iter().skip(i).step_by(count));
|
||||
}
|
||||
}
|
||||
|
||||
if channels.is_empty() || channels[0].is_empty() || sample_rate == 0 {
|
||||
return Err(String::from("Audio file is corrupt or truncated"));
|
||||
}
|
||||
Ok(DecodedAudio { channels, sample_rate })
|
||||
}
|
||||
|
||||
fn encode(channels: &[&[f32]], sample_rate: u32) -> Result<Vec<u8>, String> {
|
||||
let mut out = Vec::new();
|
||||
let mut builder = VorbisEncoderBuilder::new_with_serial(
|
||||
NonZeroU32::new(sample_rate).ok_or(String::from("Audio file is corrupt or truncated"))?,
|
||||
NonZeroU8::new(channels.len() as u8).unwrap(),
|
||||
&mut out,
|
||||
STREAM_SERIAL
|
||||
);
|
||||
builder.bitrate_management_strategy(VorbisBitrateManagementStrategy::QualityVbr {
|
||||
target_quality: ENCODE_QUALITY
|
||||
});
|
||||
let mut encoder = builder.build().map_err(|e| format!("Audio encode failed: {}", e))?;
|
||||
|
||||
let frames = channels[0].len();
|
||||
let mut i = 0;
|
||||
while i < frames {
|
||||
let end = std::cmp::min(i + ENCODE_BLOCK_FRAMES, frames);
|
||||
let block: Vec<&[f32]> = channels.iter().map(|samples| &samples[i..end]).collect();
|
||||
encoder.encode_audio_block(&block).map_err(|e| format!("Audio encode failed: {}", e))?;
|
||||
i = end;
|
||||
}
|
||||
encoder.finish().map_err(|e| format!("Audio encode failed: {}", e))?;
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
fn cue(bytes: Vec<u8>, duration_sec: f64) -> Cue {
|
||||
Cue {
|
||||
md5: format!("{:x}", md5::compute(&bytes)),
|
||||
bytes,
|
||||
duration_sec
|
||||
}
|
||||
}
|
||||
|
||||
// A one-shot line (custom-character voicelines): decode anything symphonia
|
||||
// reads, keep it as-is when it's already ogg-vorbis, otherwise transcode. No
|
||||
// cuts, fades, loop points or preview split - mono or stereo as-sourced
|
||||
pub fn process_one_shot(bytes: &[u8], max_duration_sec: f64) -> Result<Cue, String> {
|
||||
let audio = decode(bytes)?;
|
||||
let duration = audio.duration();
|
||||
if duration < 0.2 {
|
||||
return Err(String::from("Audio clip is shorter than 0.2 seconds"));
|
||||
}
|
||||
if duration > max_duration_sec {
|
||||
return Err(format!("Audio clip is {:.1} seconds long - the maximum is {:.0} seconds", duration, max_duration_sec));
|
||||
}
|
||||
if is_ogg_vorbis(bytes) {
|
||||
return Ok(cue(bytes.to_vec(), duration));
|
||||
}
|
||||
let planar: Vec<&[f32]> = audio.channels.iter().map(|samples| samples.as_slice()).collect();
|
||||
Ok(cue(encode(&planar, audio.sample_rate)?, duration))
|
||||
}
|
||||
|
||||
// The play cue is the full track, the select cue is a preview cut with short
|
||||
// fades. Both are stored content-addressed by the md5 of the final ogg bytes -
|
||||
// the client validates md5(file) against the value served in the catalog
|
||||
pub fn process(bytes: &[u8], preview_start_sec: Option<f64>, preview_length_sec: Option<f64>) -> Result<(Cue, Cue), String> {
|
||||
let audio = decode(bytes)?;
|
||||
let duration = audio.duration();
|
||||
if duration <= 1.0 {
|
||||
return Err(String::from("Audio track is too short"));
|
||||
}
|
||||
|
||||
let planar: Vec<&[f32]> = audio.channels.iter().map(|samples| samples.as_slice()).collect();
|
||||
let play = if is_ogg_vorbis(bytes) {
|
||||
// Already ogg-vorbis and proven decodable: keep the exact bytes
|
||||
cue(bytes.to_vec(), duration)
|
||||
} else {
|
||||
cue(encode(&planar, audio.sample_rate)?, duration)
|
||||
};
|
||||
|
||||
// Preview defaults: start 30% into the track, 30 seconds long
|
||||
let mut start = preview_start_sec.unwrap_or(duration * 0.3);
|
||||
if start < 0.0 || start >= duration {
|
||||
start = duration * 0.3;
|
||||
}
|
||||
let length = preview_length_sec.unwrap_or(DEFAULT_PREVIEW_LENGTH_SEC).clamp(1.0, duration - start);
|
||||
let start_frame = (start * audio.sample_rate as f64) as usize;
|
||||
let end_frame = std::cmp::min(start_frame + (length * audio.sample_rate as f64) as usize, audio.frames());
|
||||
|
||||
let fade_frames = (PREVIEW_FADE_SEC * audio.sample_rate as f64) as usize;
|
||||
let mut segment: Vec<Vec<f32>> = audio.channels.iter().map(|samples| samples[start_frame..end_frame].to_vec()).collect();
|
||||
let frames = end_frame - start_frame;
|
||||
if frames > fade_frames * 2 {
|
||||
for samples in segment.iter_mut() {
|
||||
for i in 0..fade_frames {
|
||||
let gain = i as f32 / fade_frames as f32;
|
||||
samples[i] *= gain;
|
||||
samples[frames - 1 - i] *= gain;
|
||||
}
|
||||
}
|
||||
}
|
||||
let planar: Vec<&[f32]> = segment.iter().map(|samples| samples.as_slice()).collect();
|
||||
let select = cue(encode(&planar, audio.sample_rate)?, frames as f64 / audio.sample_rate as f64);
|
||||
|
||||
Ok((play, select))
|
||||
}
|
||||
981
src/router/custom_song/chart.rs
Normal file
981
src/router/custom_song/chart.rs
Normal file
@@ -0,0 +1,981 @@
|
||||
use jzon::{object, JsonValue};
|
||||
|
||||
// Transcodes a SIF1/NPPS4 beatmap (array of {timing_sec, effect, effect_value, position})
|
||||
// into the SIF2 chart JSON the client deserializes into NoteData.
|
||||
//
|
||||
// SIF1 note effects, from the game's own LiveModel.NoteEffect
|
||||
// (m_live/model/note_effect.lua): note_normal 1, note_event 2, note_hold 3, note_bomb_1 4,
|
||||
// note_bomb_3 5, note_bomb_5 6, note_bomb_9 7, note_slide 11, note_slide_event 12,
|
||||
// note_slide_hold 13, with isHold(e) = e == 3 and isSlide(e) = e >= 11.
|
||||
//
|
||||
// SIF2 side: `type` only distinguishes an ordinary note (1) from a star/bomb note (3).
|
||||
// LiveTimeController.ToMarkerType accepts 1..3 and maps anything else to None; type 2 exists in
|
||||
// the enum but appears in ZERO of the 2146 shipped charts, so nothing emits it here.
|
||||
//
|
||||
// A SLIDE is structural, not a type. MarkerData derives it from the parent/child chain:
|
||||
// IsSliderMarker chained and the child is on a DIFFERENT line -> a slide segment
|
||||
// IsSliderLongMarker chained, child SAME line, parent different -> a slide ending in a hold
|
||||
// IsDistanceMarker has both a parent and a child -> a middle segment
|
||||
// So a hold is a chain that stays in its lane and a slide is a chain that moves across lanes;
|
||||
// both are type 1. This is also how the client counts combo (NoteData.CalcMaxCombo: a note whose
|
||||
// child shares its line does not count, its tail does).
|
||||
//
|
||||
// Mapping rules:
|
||||
// - line = position - 1 (both are right-to-left)
|
||||
// - effect 1 (note_normal) and 2 (note_event) -> type 1 (tap). note_event is an ordinary
|
||||
// note that also fed SIF1's event scoring; it plays identically and SIF2 has no
|
||||
// equivalent, so the distinction is dropped. Simultaneous hits are expressed by sharing
|
||||
// a spawn num, not by the effect.
|
||||
// - effect 3 (hold) -> head note (type 1) at timing_sec plus a SYNTHESIZED tail note
|
||||
// (type 1, same line) at timing_sec + effect_value, linked through parent/child ids
|
||||
// - effect 4/5/6/7 (bomb_1/3/5/9, SIF1's star notes) -> type 3, SIF2's bomb note. SIF1
|
||||
// varies the blast width per effect; SIF2 has one bomb with one damage value, so the
|
||||
// four collapse into type 3 and only the radius is lost. Previously only bomb_1 mapped
|
||||
// here and the three wider ones arrived as ordinary taps.
|
||||
// - effect 11/12/13 (slide) -> CHAINED across lanes, all type 1. Slides sharing a notes_level
|
||||
// form one run: sorted by time and linked parent -> child, so each link crosses lanes and
|
||||
// the client sees a slider. A run ends on effect 13 (slide hold), whose synthesized
|
||||
// same-line tail then makes it IsSliderLongMarker — the slide settling into a hold the
|
||||
// player releases. Verified against a real upload: every notes_level shared by more than
|
||||
// one note held exactly the slide-effect notes, each a monotonic sweep like
|
||||
// pos 9->8->7->6 with effects 11,11,11,13.
|
||||
// A lone slide with no chain partner stays a plain tap: a slider needs a cross-lane child.
|
||||
// - effect 0 (random) and anything else unknown -> plain type 1. Every effect the game
|
||||
// actually defines is covered above, so this is only a floor for hand-authored charts.
|
||||
// - notes_attribute is dropped (SIF2 has no per-note attribute). notes_level is consumed as
|
||||
// the chain id above and not emitted.
|
||||
// - ids are sequential from 1 in time order. num is the spawn group: the dummy
|
||||
// header occupies 100 and real groups count up from 101. The client spawns markers one
|
||||
// num-group at a time, and LiveMarkerControl.CreateMarkerUI (list overload) plain-RETURNS
|
||||
// when the group holds more than 2 markers — so a num may be shared by AT MOST two notes,
|
||||
// or the whole group's head markers never render (hold bands are created by the separate,
|
||||
// unguarded CreateLongMarkerBandUI call, which is why 4 simultaneous holds showed trails
|
||||
// with no heads). Simultaneous notes (equal final time, which covers SIF1 effect 2 pairs
|
||||
// AND synthesized hold tails) are therefore sorted by lane and chunked into pairs: each
|
||||
// chunk gets its own num, and every chunk after the first carries the PREVIOUS chunk's num
|
||||
// in force_sync_group_id. That is exactly the official encoding — all 4292 shipped NoteData
|
||||
// assets have num groups of only 1 or 2, and the 15 charts with 3-4 simultaneous notes
|
||||
// (SIFAC ports, e.g. 1132_5_Sn, 1136_5_An) pair the lowest lanes under the first num and
|
||||
// point the later chunk's m_ForceSyncGroupID at it. The client turns that into the extra
|
||||
// connector line (LiveTimeController.CreateMarkerTimeData force-group pass matches
|
||||
// ForceGroupId against the other chunk's GroupId and links the lane-closest pair).
|
||||
// - notes[0] is ALWAYS the dummy header (id 0, num 100, type 0) - the client
|
||||
// deserializes it verbatim.
|
||||
// - max_combo_count = all real notes EXCEPT hold heads whose tail is on the same
|
||||
// line (the game counts a same-lane hold as one combo for the chain)
|
||||
|
||||
// Two notes are SIMULTANEOUS (one spawn cluster) when their times agree to within this.
|
||||
// Uploaded timings are decimal literals, so notes an author meant to be simultaneous parse to
|
||||
// bit-identical f64 - but a hold's SYNTHESIZED tail is computed (timing + effect_value), and
|
||||
// e.g. 1.4 + 0.7 is 2.0999999999999996, which exact equality splits from a note literally at
|
||||
// 2.1. That cost the two the shared spawn num, and with it the client's sync connector line
|
||||
// (LiveTimeController.CreateMarkerTimeData pairs GroupSyncMarkerData by GroupId). The client
|
||||
// itself never compares two note times - simultaneity is entirely decided here by `num`, and
|
||||
// it stores time as f32 anyway - so this tolerance only has to sit above f64 accumulation
|
||||
// noise (~1e-15) and below any real spacing: the tightest a chart ever uses is a 1/64 note at
|
||||
// 250 BPM, ~15 ms, four orders of magnitude above this.
|
||||
pub const SIMULTANEOUS_EPSILON_SEC: f64 = 1e-6;
|
||||
|
||||
fn simultaneous(a: f64, b: f64) -> bool {
|
||||
(a - b).abs() <= SIMULTANEOUS_EPSILON_SEC
|
||||
}
|
||||
|
||||
// MISS window, from the live_input_result masterdata BAD row (_offsetTimeSec 0.15,
|
||||
// _offsetTimeSecSlider 0.34). LiveTimeController.UpdateMarkerTime destroys and force-MISSes a
|
||||
// marker once the chart clock passes time + this (LiveUtils.GetMissOffsetTime), so a note is
|
||||
// only judgeable while the live is still running that far past it.
|
||||
const MISS_OFFSET_SEC: f64 = 0.15;
|
||||
const MISS_OFFSET_SLIDER_SEC: f64 = 0.34;
|
||||
|
||||
// MarkerData.IsSliderMarker: a chained note with a cross-lane parent or child.
|
||||
fn is_slider(data: &JsonValue, line_of: &dyn Fn(i64) -> Option<i64>) -> bool {
|
||||
let parent_id = data["parent_id"].as_i64().unwrap_or(0);
|
||||
let child_id = data["child_id"].as_i64().unwrap_or(0);
|
||||
if parent_id == 0 && child_id == 0 {
|
||||
return false;
|
||||
}
|
||||
let line = data["line"].as_i64().unwrap_or(0);
|
||||
if child_id != 0 && data["child_line"].as_i64().unwrap_or(0) != line {
|
||||
return true;
|
||||
}
|
||||
parent_id != 0 && line_of(parent_id) != Some(line)
|
||||
}
|
||||
|
||||
// The chart clock time at which the LAST note stops being judgeable - i.e. the moment the live
|
||||
// must still be running to. The live ends when the audio does (LiveTimeController's
|
||||
// m_MusicDuration is LiveMst._endWait + the music length, and _endWait is 0 in every one of the
|
||||
// 637 official live rows and in ours), so this is what has to fit inside the audio.
|
||||
pub fn end_time(chart: &JsonValue) -> f64 {
|
||||
let lines: Vec<(i64, i64)> = chart["notes"].members().skip(1)
|
||||
.map(|n| (n["id"].as_i64().unwrap_or(0), n["line"].as_i64().unwrap_or(0)))
|
||||
.collect();
|
||||
let line_of = |id: i64| lines.iter().find(|(i, _)| *i == id).map(|(_, line)| *line);
|
||||
|
||||
let mut end: f64 = 0.0;
|
||||
for data in chart["notes"].members().skip(1) {
|
||||
let offset = if is_slider(data, &line_of) { MISS_OFFSET_SLIDER_SEC } else { MISS_OFFSET_SEC };
|
||||
end = end.max(data["time"].as_f64().unwrap_or(0.0) + offset);
|
||||
}
|
||||
end
|
||||
}
|
||||
|
||||
// The earliest note in the chart, or None for an empty chart
|
||||
pub fn first_note_time(chart: &JsonValue) -> Option<f64> {
|
||||
chart["notes"].members().skip(1)
|
||||
.filter_map(|n| n["time"].as_f64())
|
||||
.fold(None, |first: Option<f64>, time| Some(match first {
|
||||
Some(first) => first.min(time),
|
||||
None => time
|
||||
}))
|
||||
}
|
||||
|
||||
struct WorkNote {
|
||||
time: f64,
|
||||
line: i64,
|
||||
kind: i64,
|
||||
// Chain links, as indices into the work list. A hold is parent -> child on the SAME line;
|
||||
// a slide is parent -> child across DIFFERENT lines (see MarkerData.IsSliderMarker).
|
||||
parent: Option<usize>,
|
||||
child: Option<usize>
|
||||
}
|
||||
|
||||
// LiveModel.NoteEffect.isHold, widened to note_slide_hold: both carry a duration in
|
||||
// effect_value (notes.lua isTimeOver adds effect_value for note_hold and note_slide_hold alike).
|
||||
fn is_hold(effect: i64) -> bool {
|
||||
effect == 3 || effect == 13
|
||||
}
|
||||
|
||||
// LiveModel.NoteEffect.isSlide
|
||||
fn is_slide(effect: i64) -> bool {
|
||||
effect >= 11
|
||||
}
|
||||
|
||||
// SIF1's star notes: note_bomb_1/3/5/9. The suffix is the blast width — star_icon.lua maps
|
||||
// them to 0/1/2/4 extra lanes either side, damaging that spread when the note is missed.
|
||||
// SIF2 has a single bomb note with one damage value (LiveInputResultMst._bombLifeDamage,
|
||||
// applied by LiveLifeControl.CheckLife for type 3, and drawn with the star mark by
|
||||
// MarkerUI), so all four map to type 3 and only the radius is lost.
|
||||
fn is_bomb(effect: i64) -> bool {
|
||||
(4..=7).contains(&effect)
|
||||
}
|
||||
|
||||
fn parse_sif_note(data: &JsonValue, index: usize) -> Result<(f64, i64, f64, i64, i64), String> {
|
||||
let timing = data["timing_sec"].as_f64().ok_or(format!("Note {}: missing timing_sec", index))?;
|
||||
let effect = data["effect"].as_i64().ok_or(format!("Note {}: missing effect", index))?;
|
||||
let effect_value = data["effect_value"].as_f64().unwrap_or(0.0);
|
||||
let position = data["position"].as_i64().ok_or(format!("Note {}: missing position", index))?;
|
||||
// Slide chain id. SIF1 keeps it at 1 for unchained notes; editors emit an arbitrary
|
||||
// per-chain number, so it is only meaningful as "these slides belong together".
|
||||
let group = data["notes_level"].as_i64().unwrap_or(1);
|
||||
|
||||
if !(1..=9).contains(&position) {
|
||||
return Err(format!("Note {}: position {} is outside 1-9", index, position));
|
||||
}
|
||||
if timing < 0.0 {
|
||||
return Err(format!("Note {}: negative timing_sec {}", index, timing));
|
||||
}
|
||||
if is_hold(effect) && effect_value <= 0.0 {
|
||||
return Err(format!("Note {}: hold with effect_value {} (must be > 0)", index, effect_value));
|
||||
}
|
||||
|
||||
Ok((timing, effect, effect_value, position, group))
|
||||
}
|
||||
|
||||
// Returns the chart JSON and its max_combo_count (== the difficulty's full_combo)
|
||||
pub fn transcode(beatmap: &JsonValue) -> Result<(JsonValue, i64), String> {
|
||||
if !beatmap.is_array() || beatmap.is_empty() {
|
||||
return Err(String::from("Chart is not a JSON array of notes"));
|
||||
}
|
||||
|
||||
let mut work: Vec<WorkNote> = Vec::new();
|
||||
// Slide chain id -> the work indices in that chain, in input order
|
||||
let mut chains: Vec<(i64, Vec<usize>)> = Vec::new();
|
||||
for (i, data) in beatmap.members().enumerate() {
|
||||
let (timing, effect, effect_value, position, group) = parse_sif_note(data, i)?;
|
||||
|
||||
for other in beatmap.members().take(i) {
|
||||
if other["timing_sec"].as_f64() == Some(timing) && other["position"].as_i64() == Some(position) && other["effect"].as_i64() != Some(effect) {
|
||||
return Err(format!("Note {}: duplicate timing {} on position {} with a different effect", i, timing, position));
|
||||
}
|
||||
}
|
||||
|
||||
let head = work.len();
|
||||
work.push(WorkNote {
|
||||
time: timing,
|
||||
line: position - 1,
|
||||
kind: if is_bomb(effect) { 3 } else { 1 },
|
||||
parent: None,
|
||||
child: None
|
||||
});
|
||||
// notes_level > 1 identifies the chain; 1 is SIF1's "not chained" default and must NOT be
|
||||
// treated as a group, or every unchained slide in the song would link into one run
|
||||
// (notes.lua guards its own grouping the same way: `if 1 < notes_level`).
|
||||
if is_slide(effect) && group > 1 {
|
||||
match chains.iter_mut().find(|(id, _)| *id == group) {
|
||||
Some((_, members)) => members.push(head),
|
||||
None => chains.push((group, vec![head]))
|
||||
}
|
||||
}
|
||||
if is_hold(effect) {
|
||||
let tail = work.len();
|
||||
work.push(WorkNote {
|
||||
time: timing + effect_value,
|
||||
line: position - 1,
|
||||
kind: 1,
|
||||
parent: Some(head),
|
||||
child: None
|
||||
});
|
||||
work[head].child = Some(tail);
|
||||
}
|
||||
}
|
||||
|
||||
// Link each slide chain in time order. Consecutive members sit on different lines, which is
|
||||
// exactly what makes SIF2 treat the run as a slider rather than a hold. A member that already
|
||||
// has a child is a slide-hold, i.e. the end of the run, so the chain stops there — its tail
|
||||
// stays its child and the cross-lane parent link makes it IsSliderLongMarker.
|
||||
for (_, members) in chains.iter() {
|
||||
if members.len() < 2 {
|
||||
// A lone slide cannot be a slider: SIF2 needs a cross-lane child. Leave it a tap.
|
||||
continue;
|
||||
}
|
||||
let mut ordered = members.clone();
|
||||
ordered.sort_by(|a, b| work[*a].time.partial_cmp(&work[*b].time).unwrap());
|
||||
for pair in ordered.windows(2) {
|
||||
let (a, b) = (pair[0], pair[1]);
|
||||
if work[a].child.is_some() || work[b].parent.is_some() {
|
||||
break;
|
||||
}
|
||||
if work[a].line == work[b].line {
|
||||
// Same lane would read as a hold, not a slide; skip the link rather than lie
|
||||
continue;
|
||||
}
|
||||
work[a].child = Some(b);
|
||||
work[b].parent = Some(a);
|
||||
}
|
||||
}
|
||||
|
||||
// Sequential ids in time order. Stable sort keeps input order on ties
|
||||
let mut order: Vec<usize> = (0..work.len()).collect();
|
||||
order.sort_by(|a, b| work[*a].time.partial_cmp(&work[*b].time).unwrap());
|
||||
|
||||
let mut ids = vec![0i64; work.len()];
|
||||
let mut nums = vec![0i64; work.len()];
|
||||
let mut force_sync = vec![0i64; work.len()];
|
||||
let mut num = 100;
|
||||
for (i, index) in order.iter().enumerate() {
|
||||
ids[*index] = (i + 1) as i64;
|
||||
}
|
||||
// Spawn groups: at most TWO notes per num (see the header comment — a bigger group's head
|
||||
// markers never render). A cluster of simultaneous notes is sorted by lane and chunked into
|
||||
// pairs; the leftmost pair takes the first num, and each later chunk points its
|
||||
// force_sync_group_id at the previous chunk's num, matching the official SIFAC-port encoding.
|
||||
let mut start = 0;
|
||||
while start < order.len() {
|
||||
let mut end = start + 1;
|
||||
while end < order.len() && simultaneous(work[order[end]].time, work[order[start]].time) {
|
||||
end += 1;
|
||||
}
|
||||
let mut cluster: Vec<usize> = order[start..end].to_vec();
|
||||
cluster.sort_by_key(|index| work[*index].line);
|
||||
let mut prev_num = 0;
|
||||
for chunk in cluster.chunks(2) {
|
||||
num += 1;
|
||||
for index in chunk {
|
||||
nums[*index] = num;
|
||||
force_sync[*index] = prev_num;
|
||||
}
|
||||
prev_num = num;
|
||||
}
|
||||
start = end;
|
||||
}
|
||||
|
||||
let mut notes = jzon::array![{
|
||||
"id": 0, "num": 100, "line": 0, "time": 0.0, "type": 0,
|
||||
"parent_id": 0, "child_id": 0, "child_num": 0, "child_line": 0,
|
||||
"force_sync_group_id": 0
|
||||
}];
|
||||
let mut max_combo_count = 0;
|
||||
for index in order.iter() {
|
||||
let note = &work[*index];
|
||||
|
||||
// NoteData.CalcMaxCombo: a note whose child is on the SAME line (a hold) does not count,
|
||||
// its tail does. A cross-lane child (a slide segment) counts normally.
|
||||
match note.child {
|
||||
Some(child) if work[child].line == note.line => {},
|
||||
_ => max_combo_count += 1
|
||||
}
|
||||
|
||||
notes.push(object!{
|
||||
"id": ids[*index],
|
||||
"num": nums[*index],
|
||||
"line": note.line,
|
||||
"time": note.time,
|
||||
"type": note.kind,
|
||||
"parent_id": if let Some(parent) = note.parent { ids[parent] } else { 0 },
|
||||
"child_id": if let Some(child) = note.child { ids[child] } else { 0 },
|
||||
"child_num": if let Some(child) = note.child { nums[child] } else { 0 },
|
||||
"child_line": if let Some(child) = note.child { work[child].line } else { 0 },
|
||||
"force_sync_group_id": force_sync[*index]
|
||||
}).unwrap();
|
||||
}
|
||||
|
||||
Ok((object!{
|
||||
"max_lane": 9,
|
||||
"sound_name": "",
|
||||
"max_combo_count": max_combo_count,
|
||||
"notes": notes
|
||||
}, max_combo_count))
|
||||
}
|
||||
|
||||
// Regroups a STORED transcoded chart whose spawn groups predate the pairing rule above: the
|
||||
// old transcoder gave every note of an equal-time cluster one shared num (force_sync_group_id
|
||||
// always 0), and the client renders no head markers for a group of 3+ (see the header
|
||||
// comment). This rebuilds num / force_sync_group_id in place with the same clustering the
|
||||
// transcoder now uses — equal final time, lane-sorted, chunks of two, chained
|
||||
// force_sync_group_id — and re-points child_num at each child's renumbered spawn group.
|
||||
// Everything else (ids, times, lines, types, parent/child links, max_combo_count — combo
|
||||
// counting never depended on grouping) is untouched, so on a chart the current transcoder
|
||||
// produced this reproduces the stored bytes exactly.
|
||||
//
|
||||
// Returns false (chart untouched) unless some num is shared by MORE than two notes. That
|
||||
// makes it a safe no-op on current uploads AND on official-style encodings (whose num values
|
||||
// differ from ours — e.g. gaps of 3 — but whose groups never exceed two).
|
||||
pub fn regroup(chart: &mut JsonValue) -> bool {
|
||||
// (id, time, line) per real note; the dummy header at [0] stays untouched
|
||||
let notes: Vec<(i64, f64, i64)> = chart["notes"].members().skip(1).map(|n| (
|
||||
n["id"].as_i64().unwrap_or(0),
|
||||
n["time"].as_f64().unwrap_or(0.0),
|
||||
n["line"].as_i64().unwrap_or(0)
|
||||
)).collect();
|
||||
|
||||
// Only a pre-pairing chart (some num shared 3+ ways) is rewritten
|
||||
let mut group_sizes: Vec<(i64, i64)> = Vec::new();
|
||||
for data in chart["notes"].members().skip(1) {
|
||||
let num = data["num"].as_i64().unwrap_or(0);
|
||||
match group_sizes.iter_mut().find(|(n, _)| *n == num) {
|
||||
Some((_, count)) => *count += 1,
|
||||
None => group_sizes.push((num, 1))
|
||||
}
|
||||
}
|
||||
if group_sizes.iter().all(|(_, count)| *count <= 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Time order; ids break ties (transcode issues them in time order, so this reproduces
|
||||
// the emission order the grouping pass originally saw)
|
||||
let mut order: Vec<usize> = (0..notes.len()).collect();
|
||||
order.sort_by(|a, b| notes[*a].1.total_cmp(¬es[*b].1).then(notes[*a].0.cmp(¬es[*b].0)));
|
||||
|
||||
// id -> (new num, new force_sync_group_id)
|
||||
let mut assigned: Vec<(i64, i64, i64)> = Vec::with_capacity(notes.len());
|
||||
let mut num = 100;
|
||||
let mut start = 0;
|
||||
while start < order.len() {
|
||||
let mut end = start + 1;
|
||||
while end < order.len() && simultaneous(notes[order[end]].1, notes[order[start]].1) {
|
||||
end += 1;
|
||||
}
|
||||
let mut cluster: Vec<usize> = order[start..end].to_vec();
|
||||
cluster.sort_by_key(|index| notes[*index].2);
|
||||
let mut prev_num = 0;
|
||||
for chunk in cluster.chunks(2) {
|
||||
num += 1;
|
||||
for index in chunk {
|
||||
assigned.push((notes[*index].0, num, prev_num));
|
||||
}
|
||||
prev_num = num;
|
||||
}
|
||||
start = end;
|
||||
}
|
||||
let lookup = |id: i64| assigned.iter().find(|(i, _, _)| *i == id).map(|(_, n, f)| (*n, *f));
|
||||
|
||||
for data in chart["notes"].members_mut().skip(1) {
|
||||
let Some((new_num, force)) = lookup(data["id"].as_i64().unwrap_or(0)) else { continue; };
|
||||
data["num"] = new_num.into();
|
||||
data["force_sync_group_id"] = force.into();
|
||||
let child = data["child_id"].as_i64().unwrap_or(0);
|
||||
if child != 0 {
|
||||
// child_num names the child's spawn group and must follow its new num
|
||||
data["child_num"] = lookup(child).map(|(n, _)| n).unwrap_or(0).into();
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
// Test helper: fabricates what pre-pairing servers stored, by squashing a current chart back
|
||||
// to the OLD encoding — one shared num per equal-time cluster, force_sync_group_id 0, and
|
||||
// child_num following. Lives outside the tests module so the migration tests in
|
||||
// router/custom_song.rs can build realistic pre-fix fixtures from transcode output.
|
||||
#[cfg(test)]
|
||||
pub fn squash_to_pre_fix(chart: &mut JsonValue) {
|
||||
let notes: Vec<(i64, f64)> = chart["notes"].members().skip(1)
|
||||
.map(|n| (n["id"].as_i64().unwrap(), n["time"].as_f64().unwrap()))
|
||||
.collect();
|
||||
let mut order: Vec<usize> = (0..notes.len()).collect();
|
||||
order.sort_by(|a, b| notes[*a].1.total_cmp(¬es[*b].1).then(notes[*a].0.cmp(¬es[*b].0)));
|
||||
let mut nums: Vec<(i64, i64)> = Vec::new();
|
||||
let mut num = 100;
|
||||
let mut last_time = f64::NEG_INFINITY;
|
||||
for index in order {
|
||||
if notes[index].1 != last_time {
|
||||
num += 1;
|
||||
last_time = notes[index].1;
|
||||
}
|
||||
nums.push((notes[index].0, num));
|
||||
}
|
||||
let lookup = |id: i64| nums.iter().find(|(i, _)| *i == id).map(|(_, n)| *n).unwrap_or(0);
|
||||
for data in chart["notes"].members_mut().skip(1) {
|
||||
data["num"] = lookup(data["id"].as_i64().unwrap()).into();
|
||||
data["force_sync_group_id"] = 0.into();
|
||||
let child = data["child_id"].as_i64().unwrap_or(0);
|
||||
if child != 0 {
|
||||
data["child_num"] = lookup(child).into();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn sif_note(timing_sec: f64, position: i64, effect: i64, effect_value: f64) -> JsonValue {
|
||||
object!{
|
||||
"timing_sec": timing_sec,
|
||||
"notes_attribute": 1,
|
||||
"notes_level": 1,
|
||||
"effect": effect,
|
||||
"effect_value": effect_value,
|
||||
"position": position
|
||||
}
|
||||
}
|
||||
|
||||
// A slide carrying its chain id; slides sharing one belong to the same run
|
||||
fn sif_slide(timing_sec: f64, position: i64, effect: i64, effect_value: f64, group: i64) -> JsonValue {
|
||||
object!{
|
||||
"timing_sec": timing_sec,
|
||||
"notes_attribute": 1,
|
||||
"notes_level": group,
|
||||
"effect": effect,
|
||||
"effect_value": effect_value,
|
||||
"position": position
|
||||
}
|
||||
}
|
||||
|
||||
// (line, type, parent_id, child_id, child_line) for each note after the dummy header
|
||||
fn shape(chart: &JsonValue) -> Vec<(i64, i64, i64, i64, i64)> {
|
||||
chart["notes"].members().skip(1).map(|d| (
|
||||
d["line"].as_i64().unwrap(),
|
||||
d["type"].as_i64().unwrap(),
|
||||
d["parent_id"].as_i64().unwrap(),
|
||||
d["child_id"].as_i64().unwrap(),
|
||||
d["child_line"].as_i64().unwrap()
|
||||
)).collect()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn plain_taps() {
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 1, 1, 2.0),
|
||||
sif_note(2.0, 5, 1, 2.0),
|
||||
sif_note(3.0, 9, 1, 2.0)
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
assert_eq!(combo, 3);
|
||||
assert_eq!(chart["max_combo_count"], 3);
|
||||
assert_eq!(chart["max_lane"], 9);
|
||||
assert_eq!(chart["notes"].len(), 4);
|
||||
// Dummy header is verbatim
|
||||
assert_eq!(chart["notes"][0]["id"], 0);
|
||||
assert_eq!(chart["notes"][0]["num"], 100);
|
||||
assert_eq!(chart["notes"][0]["type"], 0);
|
||||
// Real notes: sequential ids, monotonic nums, right-to-left lines
|
||||
assert_eq!(chart["notes"][1]["id"], 1);
|
||||
assert_eq!(chart["notes"][1]["num"], 101);
|
||||
assert_eq!(chart["notes"][1]["line"], 0);
|
||||
assert_eq!(chart["notes"][1]["type"], 1);
|
||||
assert_eq!(chart["notes"][2]["num"], 102);
|
||||
assert_eq!(chart["notes"][2]["line"], 4);
|
||||
assert_eq!(chart["notes"][3]["id"], 3);
|
||||
assert_eq!(chart["notes"][3]["num"], 103);
|
||||
assert_eq!(chart["notes"][3]["line"], 8);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn hold_head_and_tail() {
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 3, 3, 2.5)
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
// The synthesized same-lane tail counts, the head does not
|
||||
assert_eq!(combo, 1);
|
||||
assert_eq!(chart["notes"].len(), 3);
|
||||
let head = &chart["notes"][1];
|
||||
let tail = &chart["notes"][2];
|
||||
assert_eq!(head["id"], 1);
|
||||
assert_eq!(head["child_id"], 2);
|
||||
assert_eq!(head["child_num"], tail["num"].clone());
|
||||
assert_eq!(head["child_line"], 2);
|
||||
assert_eq!(head["parent_id"], 0);
|
||||
assert_eq!(tail["id"], 2);
|
||||
assert_eq!(tail["parent_id"], 1);
|
||||
assert_eq!(tail["child_id"], 0);
|
||||
assert_eq!(tail["line"], 2);
|
||||
assert_eq!(tail["time"].as_f64().unwrap(), 3.5);
|
||||
}
|
||||
|
||||
// A hold tail's time is COMPUTED (timing + effect_value), so it can land a few f64 ulps off
|
||||
// a note written at the same beat - 1.4 + 0.7 is 2.0999999999999996, not 2.1. Exact equality
|
||||
// split those two into separate spawn groups and the client lost the sync connector line
|
||||
// between them; the epsilon keeps them together. The tail must still be emitted at its own
|
||||
// computed time (the client stores time as f32, which lands both on 2.1 anyway)
|
||||
#[test]
|
||||
fn a_computed_hold_tail_shares_the_beats_spawn_group() {
|
||||
assert_ne!(1.4f64 + 0.7f64, 2.1f64);
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.4, 3, 3, 0.7), // hold, tail computed at 2.0999999999999996
|
||||
sif_note(2.1, 7, 1, 0.0) // tap written at 2.1
|
||||
];
|
||||
let (chart, _) = transcode(&beatmap).unwrap();
|
||||
|
||||
let tail = chart["notes"].members().find(|n| n["parent_id"] != 0).unwrap();
|
||||
let tap = chart["notes"].members().find(|n| n["line"] == 6).unwrap();
|
||||
assert_eq!(tail["num"], tap["num"].clone());
|
||||
assert!((tail["time"].as_f64().unwrap() - 2.1).abs() < 1e-9);
|
||||
assert_spawn_groups_hold_at_most_two(&chart);
|
||||
|
||||
// Genuinely distinct beats stay distinct: the epsilon is orders of magnitude below the
|
||||
// tightest spacing a chart ever uses (a 1/64 note at 250 BPM is ~15 ms)
|
||||
let beatmap = jzon::array![
|
||||
sif_note(2.1, 3, 1, 0.0),
|
||||
sif_note(2.115, 7, 1, 0.0)
|
||||
];
|
||||
let (chart, _) = transcode(&beatmap).unwrap();
|
||||
assert_ne!(chart["notes"][1]["num"], chart["notes"][2]["num"].clone());
|
||||
}
|
||||
|
||||
// end_time is what validate_chart_fits_audio compares against the track length: the last
|
||||
// moment a note is still judgeable, using the BAD-row MISS window (0.15 tap / 0.34 slider)
|
||||
#[test]
|
||||
fn end_time_uses_the_miss_window_of_the_last_note() {
|
||||
let (chart, _) = transcode(&jzon::array![sif_note(10.0, 3, 1, 0.0)]).unwrap();
|
||||
assert!((end_time(&chart) - 10.15).abs() < 1e-9);
|
||||
assert_eq!(first_note_time(&chart), Some(10.0));
|
||||
|
||||
// A hold: the synthesized tail is the last note, and it is same-lane so not a slider
|
||||
let (chart, _) = transcode(&jzon::array![sif_note(10.0, 3, 3, 2.0)]).unwrap();
|
||||
assert!((end_time(&chart) - 12.15).abs() < 1e-9);
|
||||
assert_eq!(first_note_time(&chart), Some(10.0));
|
||||
|
||||
// A cross-lane slide run: every segment is a slider, so the wider window applies
|
||||
let (chart, _) = transcode(&jzon::array![
|
||||
sif_slide(10.0, 9, 11, 0.0, 5),
|
||||
sif_slide(10.5, 8, 11, 0.0, 5)
|
||||
]).unwrap();
|
||||
assert!((end_time(&chart) - 10.84).abs() < 1e-9);
|
||||
}
|
||||
|
||||
// The client spawns markers one num-group at a time and CreateMarkerUI refuses lists of
|
||||
// more than 2, so no num may ever be shared by 3+ notes (official charts never do)
|
||||
fn assert_spawn_groups_hold_at_most_two(chart: &JsonValue) {
|
||||
let mut counts: Vec<(i64, i64)> = Vec::new();
|
||||
for data in chart["notes"].members().skip(1) {
|
||||
let num = data["num"].as_i64().unwrap();
|
||||
match counts.iter_mut().find(|(n, _)| *n == num) {
|
||||
Some((_, c)) => *c += 1,
|
||||
None => counts.push((num, 1))
|
||||
}
|
||||
}
|
||||
for (num, count) in counts {
|
||||
assert!(count <= 2, "num {} is shared by {} notes; the client renders no heads for such a group", num, count);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parallel_pair() {
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 2, 2, 2.0),
|
||||
sif_note(1.0, 8, 2, 2.0)
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
// Simultaneous notes share a spawn group and both count
|
||||
assert_eq!(combo, 2);
|
||||
assert_eq!(chart["notes"][1]["num"], chart["notes"][2]["num"].clone());
|
||||
assert_eq!(chart["notes"][1]["type"], 1);
|
||||
assert_eq!(chart["notes"][2]["type"], 1);
|
||||
// A plain pair is the GroupSync path; the force-group field stays clear
|
||||
assert_eq!(chart["notes"][1]["force_sync_group_id"], 0);
|
||||
assert_eq!(chart["notes"][2]["force_sync_group_id"], 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn three_simultaneous_notes_split_into_pair_plus_force_synced_single() {
|
||||
// Official encoding (e.g. 1132_5_Sn, 1136_5_An: the only shipped charts with 3-4
|
||||
// simultaneous notes): the cluster is sorted by lane, the lowest two lanes share the
|
||||
// first num, and the leftover note takes the NEXT num with force_sync_group_id pointing
|
||||
// back at the pair's num. Input arrives lane-scrambled to prove the chunking sorts.
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 8, 1, 0.0),
|
||||
sif_note(1.0, 2, 1, 0.0),
|
||||
sif_note(1.0, 5, 1, 0.0)
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
assert_eq!(combo, 3);
|
||||
assert_eq!(chart["notes"].len(), 4);
|
||||
assert_spawn_groups_hold_at_most_two(&chart);
|
||||
// Emission keeps input order on time ties; grouping is by lane
|
||||
let (right, left, mid) = (&chart["notes"][1], &chart["notes"][2], &chart["notes"][3]);
|
||||
assert_eq!(left["line"], 1);
|
||||
assert_eq!(mid["line"], 4);
|
||||
assert_eq!(right["line"], 7);
|
||||
// Lanes 1 and 4 pair under the first num, force-clear
|
||||
assert_eq!(left["num"], 101);
|
||||
assert_eq!(mid["num"], 101);
|
||||
assert_eq!(left["force_sync_group_id"], 0);
|
||||
assert_eq!(mid["force_sync_group_id"], 0);
|
||||
// Lane 7 rides the next num and force-syncs against the pair's num
|
||||
assert_eq!(right["num"], 102);
|
||||
assert_eq!(right["force_sync_group_id"], 101);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn four_simultaneous_holds_pair_heads_and_tails() {
|
||||
// Second field report: 4 holds hitting together rendered their bands but no head
|
||||
// markers — all four heads shared one num, and the client's CreateMarkerUI refuses
|
||||
// groups over 2 while CreateLongMarkerBandUI (a separate, unguarded call) still drew
|
||||
// the bands. Officially both the head cluster AND the tail cluster split 2+2 with the
|
||||
// second chunk force-synced to the first (1132_5_Sn time 12.208 does this to tails).
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 3, 3, 2.0),
|
||||
sif_note(1.0, 4, 3, 2.0),
|
||||
sif_note(1.0, 6, 3, 2.0),
|
||||
sif_note(1.0, 7, 3, 2.0)
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
// Same-lane hold heads don't count; the four tails do
|
||||
assert_eq!(combo, 4);
|
||||
assert_eq!(chart["notes"].len(), 9);
|
||||
assert_spawn_groups_hold_at_most_two(&chart);
|
||||
|
||||
// Heads at 1.0: lanes 2,3 share num 101; lanes 5,6 share num 102 force-synced to 101
|
||||
for (index, line, num, fs) in [(1, 2, 101, 0), (2, 3, 101, 0), (3, 5, 102, 101), (4, 6, 102, 101)] {
|
||||
let head = &chart["notes"][index];
|
||||
assert_eq!(head["line"], line, "head {}", index);
|
||||
assert_eq!(head["num"], num, "head {}", index);
|
||||
assert_eq!(head["force_sync_group_id"], fs, "head {}", index);
|
||||
assert_eq!(head["parent_id"], 0, "head {}", index);
|
||||
}
|
||||
// Tails at 3.0: the SAME pairing applies to the synthesized cluster
|
||||
for (index, line, num, fs) in [(5, 2, 103, 0), (6, 3, 103, 0), (7, 5, 104, 103), (8, 6, 104, 103)] {
|
||||
let tail = &chart["notes"][index];
|
||||
assert_eq!(tail["line"], line, "tail {}", index);
|
||||
assert_eq!(tail["num"], num, "tail {}", index);
|
||||
assert_eq!(tail["force_sync_group_id"], fs, "tail {}", index);
|
||||
assert_eq!(tail["child_id"], 0, "tail {}", index);
|
||||
}
|
||||
// The chains still line up: each head's child_num names the tail's spawn group
|
||||
assert_eq!(chart["notes"][1]["child_id"], 5);
|
||||
assert_eq!(chart["notes"][1]["child_num"], 103);
|
||||
assert_eq!(chart["notes"][3]["child_id"], 7);
|
||||
assert_eq!(chart["notes"][3]["child_num"], 104);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mixed() {
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 5, 1, 2.0), // tap
|
||||
sif_note(2.0, 3, 3, 1.5), // hold: head at 2.0, tail at 3.5
|
||||
sif_note(2.5, 7, 4, 0.0), // star
|
||||
sif_note(3.5, 1, 2, 2.0), // parallel with the hold tail
|
||||
sif_note(4.0, 9, 11, 0.0) // lone slide, no chain partner -> stays a tap
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
// 6 real notes, minus the same-lane hold head
|
||||
assert_eq!(combo, 5);
|
||||
assert_eq!(chart["notes"].len(), 7);
|
||||
// Time order: tap(1.0), head(2.0), star(2.5), tail(3.5), parallel(3.5), swing(4.0)
|
||||
assert_eq!(chart["notes"][2]["child_id"], 4);
|
||||
assert_eq!(chart["notes"][3]["type"], 3);
|
||||
assert_eq!(chart["notes"][4]["parent_id"], 2);
|
||||
// The tail and the parallel tap at 3.5 share a spawn group
|
||||
assert_eq!(chart["notes"][4]["num"], chart["notes"][5]["num"].clone());
|
||||
assert_eq!(chart["notes"][6]["type"], 1);
|
||||
// Ids stay sequential in time order
|
||||
for (i, data) in chart["notes"].members().enumerate() {
|
||||
assert_eq!(data["id"], i);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn slide_chain_links_across_lanes() {
|
||||
// A three-note sweep right to left, one chain. Every link must cross lanes, which is
|
||||
// what MarkerData.IsSliderMarker keys on.
|
||||
let beatmap = jzon::array![
|
||||
sif_slide(1.0, 9, 11, 0.0, 500),
|
||||
sif_slide(1.2, 8, 11, 0.0, 500),
|
||||
sif_slide(1.4, 7, 12, 0.0, 500)
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
// No tails: nothing here is a hold
|
||||
assert_eq!(chart["notes"].len(), 4);
|
||||
// Slides are ordinary notes; the chain carries the meaning
|
||||
assert_eq!(shape(&chart), vec![
|
||||
(8, 1, 0, 2, 7), // root, child on line 7
|
||||
(7, 1, 1, 3, 6), // middle: has parent AND child -> IsDistanceMarker
|
||||
(6, 1, 2, 0, 0) // last of the run
|
||||
]);
|
||||
// Every link crosses lanes, so all three count for combo
|
||||
assert_eq!(combo, 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn separate_chains_do_not_link() {
|
||||
let beatmap = jzon::array![
|
||||
sif_slide(1.0, 9, 11, 0.0, 500),
|
||||
sif_slide(1.2, 8, 11, 0.0, 500),
|
||||
sif_slide(2.0, 4, 11, 0.0, 501),
|
||||
sif_slide(2.2, 3, 11, 0.0, 501)
|
||||
];
|
||||
let (chart, _) = transcode(&beatmap).unwrap();
|
||||
assert_eq!(shape(&chart), vec![
|
||||
(8, 1, 0, 2, 7),
|
||||
(7, 1, 1, 0, 0), // chain 500 ends here, does not reach chain 501
|
||||
(3, 1, 0, 4, 2),
|
||||
(2, 1, 3, 0, 0)
|
||||
]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn default_notes_level_does_not_chain() {
|
||||
// notes_level 1 is SIF1's "unchained" default. Treating it as a group id would link every
|
||||
// slide in the song into one run spanning the whole track.
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 9, 11, 0.0),
|
||||
sif_note(1.2, 8, 11, 0.0),
|
||||
sif_note(40.0, 2, 11, 0.0)
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
assert_eq!(shape(&chart), vec![
|
||||
(8, 1, 0, 0, 0),
|
||||
(7, 1, 0, 0, 0),
|
||||
(1, 1, 0, 0, 0)
|
||||
]);
|
||||
assert_eq!(combo, 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lone_slide_stays_a_tap() {
|
||||
// Nothing to chain to, and a slider needs a cross-lane child
|
||||
let (chart, combo) = transcode(&jzon::array![sif_slide(1.0, 5, 11, 0.0, 500)]).unwrap();
|
||||
assert_eq!(chart["notes"].len(), 2);
|
||||
assert_eq!(shape(&chart), vec![(4, 1, 0, 0, 0)]);
|
||||
assert_eq!(combo, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn slide_chain_ends_in_a_hold() {
|
||||
// A sweep terminating on effect 13: the run settles into a hold on the last lane.
|
||||
// Regression: effect 13 used to lose its hold entirely and arrive as a lone note.
|
||||
let beatmap = jzon::array![
|
||||
sif_slide(1.0, 9, 11, 0.0, 500),
|
||||
sif_slide(1.2, 8, 11, 0.0, 500),
|
||||
sif_slide(1.4, 7, 13, 0.5, 500)
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
assert_eq!(chart["notes"].len(), 5);
|
||||
assert_eq!(shape(&chart), vec![
|
||||
(8, 1, 0, 2, 7), // root of the slide
|
||||
(7, 1, 1, 3, 6), // middle
|
||||
(6, 1, 2, 4, 6), // parent on line 7, child on line 6 -> IsSliderLongMarker
|
||||
(6, 1, 3, 0, 0) // the hold tail, released normally
|
||||
]);
|
||||
// The tail sits at the slide-hold's time plus its duration
|
||||
assert_eq!(chart["notes"][4]["time"].as_f64().unwrap(), 1.9);
|
||||
// The same-lane hold head does not count; its tail does
|
||||
assert_eq!(combo, 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn slide_hold_needs_a_duration() {
|
||||
// The effect 3 duration check has to cover note_slide_hold too
|
||||
assert!(transcode(&jzon::array![sif_note(1.0, 5, 13, 0.0)]).is_err());
|
||||
assert!(transcode(&jzon::array![sif_note(1.0, 5, 13, -1.0)]).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn every_bomb_width_is_a_star_note() {
|
||||
// note_bomb_1/3/5/9. SIF2 has one bomb note, so all four land on type 3; before,
|
||||
// only bomb_1 did and the wider three arrived as ordinary taps.
|
||||
for effect in [4, 5, 6, 7] {
|
||||
let (chart, combo) = transcode(&jzon::array![sif_note(1.0, 5, effect, 0.0)]).unwrap();
|
||||
assert_eq!(chart["notes"][1]["type"], 3, "effect {}", effect);
|
||||
// Bombs are instantaneous — no tail, and they count for combo
|
||||
assert_eq!(chart["notes"].len(), 2, "effect {}", effect);
|
||||
assert_eq!(chart["notes"][1]["child_id"], 0, "effect {}", effect);
|
||||
assert_eq!(combo, 1, "effect {}", effect);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn every_defined_effect_maps_to_a_real_note_type() {
|
||||
// The whole LiveModel.NoteEffect vocabulary, and what each must become
|
||||
for (effect, kind) in [(1, 1), (2, 1), (3, 1), (4, 3), (5, 3), (6, 3), (7, 3), (11, 1), (12, 1), (13, 1)] {
|
||||
let (chart, _) = transcode(&jzon::array![sif_note(1.0, 5, effect, 1.0)]).unwrap();
|
||||
assert_eq!(chart["notes"][1]["type"], kind, "effect {}", effect);
|
||||
// Whatever it is, the client must be able to resolve it
|
||||
for data in chart["notes"].members().skip(1) {
|
||||
let t = data["type"].as_i64().unwrap();
|
||||
assert!((1..=3).contains(&t), "effect {} produced unresolvable type {}", effect, t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn undefined_effects_fall_back_to_taps() {
|
||||
// Not part of NoteEffect; a hand-authored chart must still transcode to something valid
|
||||
for effect in [0, 8, 9, 10] {
|
||||
let (chart, _) = transcode(&jzon::array![sif_note(1.0, 5, effect, 0.0)]).unwrap();
|
||||
assert_eq!(chart["notes"][1]["type"], 1, "effect {}", effect);
|
||||
}
|
||||
}
|
||||
|
||||
// Lifted verbatim from a chart uploaded to the live server (custom song 10008, "Edelied",
|
||||
// exported via /custom_song/download/10008) — a swipe run of note_slide into note_slide_hold,
|
||||
// which is the shape that used to arrive as undifferentiated taps. Note the editor writes a
|
||||
// large arbitrary notes_level (38615 here) rather than SIF1's small group index, which is why
|
||||
// notes_level is not used as a sync group.
|
||||
#[test]
|
||||
fn real_uploaded_swipe_run() {
|
||||
let beatmap = jzon::array![
|
||||
object!{ "timing_sec": 22.0, "effect": 11, "effect_value": 2.0, "notes_attribute": 2, "notes_level": 38615, "position": 9 },
|
||||
object!{ "timing_sec": 22.166666666666668, "effect": 11, "effect_value": 2.0, "notes_attribute": 2, "notes_level": 38615, "position": 8 },
|
||||
object!{ "timing_sec": 22.333333333333332, "effect": 11, "effect_value": 2.0, "notes_attribute": 2, "notes_level": 38615, "position": 7 },
|
||||
object!{ "timing_sec": 22.5, "effect": 13, "effect_value": 0.33333333333333215, "notes_attribute": 2, "notes_level": 38615, "position": 6 }
|
||||
];
|
||||
let (chart, combo) = transcode(&beatmap).unwrap();
|
||||
|
||||
// 4 source notes + the slide-hold's tail, plus the dummy header
|
||||
assert_eq!(chart["notes"].len(), 6);
|
||||
// One slider running 9 -> 8 -> 7 -> 6 (lines 8..5), the last settling into a hold
|
||||
assert_eq!(shape(&chart), vec![
|
||||
(8, 1, 0, 2, 7),
|
||||
(7, 1, 1, 3, 6),
|
||||
(6, 1, 2, 4, 5),
|
||||
(5, 1, 3, 5, 5), // slide into hold
|
||||
(5, 1, 4, 0, 0) // tail
|
||||
]);
|
||||
// The same-lane hold head is the only note that does not count
|
||||
assert_eq!(combo, 4);
|
||||
// Every type must be one ToMarkerType resolves; 0 would silently become MarkerType.None
|
||||
for data in chart["notes"].members().skip(1) {
|
||||
let kind = data["type"].as_i64().unwrap();
|
||||
assert!((1..=3).contains(&kind), "unresolvable type {}", kind);
|
||||
}
|
||||
}
|
||||
|
||||
// The 10011 field shape: 4 parallel holds into a full 9-lane wall into a triple. Squashing
|
||||
// transcode output reproduces the old encoding exactly (one num per cluster, no force
|
||||
// links); regroup must restore the current encoding BYTE-IDENTICALLY, child_num included.
|
||||
#[test]
|
||||
fn regroup_restores_pre_fix_wall_and_parallel_holds() {
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 2, 3, 1.0), sif_note(1.0, 4, 3, 1.0),
|
||||
sif_note(1.0, 6, 3, 1.0), sif_note(1.0, 8, 3, 1.0),
|
||||
sif_note(2.75, 1, 1, 0.0), sif_note(2.75, 2, 1, 0.0), sif_note(2.75, 3, 1, 0.0),
|
||||
sif_note(2.75, 4, 1, 0.0), sif_note(2.75, 5, 1, 0.0), sif_note(2.75, 6, 1, 0.0),
|
||||
sif_note(2.75, 7, 1, 0.0), sif_note(2.75, 8, 1, 0.0), sif_note(2.75, 9, 1, 0.0),
|
||||
sif_note(3.625, 3, 1, 0.0), sif_note(3.625, 5, 1, 0.0), sif_note(3.625, 7, 1, 0.0)
|
||||
];
|
||||
let (expected, _) = transcode(&beatmap).unwrap();
|
||||
|
||||
let mut chart = expected.clone();
|
||||
squash_to_pre_fix(&mut chart);
|
||||
// Sanity: the squash really is the old encoding — whole clusters share one num
|
||||
assert_eq!(chart["notes"][1]["num"], 101);
|
||||
assert_eq!(chart["notes"][4]["num"], 101); // all 4 hold heads
|
||||
assert_eq!(chart["notes"][9]["num"], 103);
|
||||
assert_eq!(chart["notes"][17]["num"], 103); // all 9 wall notes
|
||||
assert_eq!(chart["notes"][1]["child_num"], 102, "squashed child_num must follow");
|
||||
for data in chart["notes"].members() {
|
||||
assert_eq!(data["force_sync_group_id"], 0);
|
||||
}
|
||||
|
||||
assert!(regroup(&mut chart), "a squashed chart must be rewritten");
|
||||
assert_eq!(jzon::stringify(chart.clone()), jzon::stringify(expected.clone()),
|
||||
"regroup must reproduce the current transcoder's output exactly");
|
||||
|
||||
// Spell the wall out: adjacent-lane pairs, each later chunk force-synced to the
|
||||
// previous one (heads 101/102, tails 103/104, wall 105..109, triple 110/111)
|
||||
assert_spawn_groups_hold_at_most_two(&chart);
|
||||
let wall: Vec<(i64, i64, i64)> = chart["notes"].members()
|
||||
.filter(|d| d["time"].as_f64() == Some(2.75))
|
||||
.map(|d| (d["line"].as_i64().unwrap(), d["num"].as_i64().unwrap(), d["force_sync_group_id"].as_i64().unwrap()))
|
||||
.collect();
|
||||
let mut wall_sorted = wall.clone();
|
||||
wall_sorted.sort();
|
||||
assert_eq!(wall_sorted, vec![
|
||||
(0, 105, 0), (1, 105, 0),
|
||||
(2, 106, 105), (3, 106, 105),
|
||||
(4, 107, 106), (5, 107, 106),
|
||||
(6, 108, 107), (7, 108, 107),
|
||||
(8, 109, 108)
|
||||
]);
|
||||
// child_num follows the child's NEW num: each head's child_num names a tail group
|
||||
for head in chart["notes"].members().filter(|d| d["time"].as_f64() == Some(1.0)) {
|
||||
let child_id = head["child_id"].as_i64().unwrap();
|
||||
let tail = chart["notes"].members().find(|d| d["id"].as_i64() == Some(child_id)).unwrap();
|
||||
assert_eq!(head["child_num"], tail["num"].clone());
|
||||
assert!([103, 104].contains(&tail["num"].as_i64().unwrap()));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn regroup_is_a_no_op_on_current_encoding() {
|
||||
let beatmap = jzon::array![
|
||||
sif_note(1.0, 2, 1, 0.0), sif_note(1.0, 5, 1, 0.0), sif_note(1.0, 8, 1, 0.0),
|
||||
sif_note(2.0, 4, 3, 1.5)
|
||||
];
|
||||
let (chart, _) = transcode(&beatmap).unwrap();
|
||||
let before = jzon::stringify(chart.clone());
|
||||
let mut chart = chart;
|
||||
assert!(!regroup(&mut chart));
|
||||
assert_eq!(jzon::stringify(chart), before);
|
||||
}
|
||||
|
||||
// Official-shaped encodings (1132_5_Sn t=9.781: num gaps of 3, force_sync naming the other
|
||||
// pair) have groups of at most two and must never be "normalized" to our num sequence
|
||||
#[test]
|
||||
fn regroup_is_a_no_op_on_official_shaped_charts() {
|
||||
let mut chart = object!{
|
||||
"max_lane": 9, "sound_name": "", "max_combo_count": 4,
|
||||
"notes": [
|
||||
{"id": 0, "num": 100, "line": 0, "time": 0.0, "type": 0, "parent_id": 0, "child_id": 0, "child_num": 0, "child_line": 0, "force_sync_group_id": 0},
|
||||
{"id": 45, "num": 145, "line": 0, "time": 9.781, "type": 1, "parent_id": 0, "child_id": 0, "child_num": 0, "child_line": 0, "force_sync_group_id": 0},
|
||||
{"id": 46, "num": 145, "line": 1, "time": 9.781, "type": 1, "parent_id": 0, "child_id": 0, "child_num": 0, "child_line": 0, "force_sync_group_id": 0},
|
||||
{"id": 47, "num": 148, "line": 7, "time": 9.781, "type": 1, "parent_id": 0, "child_id": 0, "child_num": 0, "child_line": 0, "force_sync_group_id": 145},
|
||||
{"id": 48, "num": 148, "line": 8, "time": 9.781, "type": 1, "parent_id": 0, "child_id": 0, "child_num": 0, "child_line": 0, "force_sync_group_id": 145}
|
||||
]
|
||||
};
|
||||
let before = jzon::stringify(chart.clone());
|
||||
assert!(!regroup(&mut chart));
|
||||
assert_eq!(jzon::stringify(chart), before);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_bad_charts() {
|
||||
assert!(transcode(&jzon::array![sif_note(1.0, 0, 1, 2.0)]).is_err());
|
||||
assert!(transcode(&jzon::array![sif_note(1.0, 10, 1, 2.0)]).is_err());
|
||||
assert!(transcode(&jzon::array![sif_note(-1.0, 5, 1, 2.0)]).is_err());
|
||||
assert!(transcode(&jzon::array![sif_note(1.0, 5, 3, 0.0)]).is_err());
|
||||
assert!(transcode(&jzon::array![sif_note(1.0, 5, 1, 2.0), sif_note(1.0, 5, 3, 2.0)]).is_err());
|
||||
assert!(transcode(&jzon::object!{}).is_err());
|
||||
}
|
||||
|
||||
}
|
||||
121
src/router/custom_song/migrate.rs
Normal file
121
src/router/custom_song/migrate.rs
Normal file
@@ -0,0 +1,121 @@
|
||||
use std::fs;
|
||||
|
||||
use super::{chart, database, song_path, asset_meta, LEVEL_COUNT};
|
||||
use crate::runtime::get_data_path;
|
||||
|
||||
// One-time, idempotent startup migration for charts transcoded before the spawn-group pairing
|
||||
// rule (chart.rs header): the old transcoder gave every note of an equal-time cluster ONE
|
||||
// shared num, and the client creates no head markers for a group of 3+ notes
|
||||
// (LiveMarkerControl.CreateMarkerUI plain-returns on count > 2), so 3+ simultaneous notes
|
||||
// were judged but never rendered. Stored transcoded charts are derived data with everything
|
||||
// the regroup needs (time + line per note), so they are rewritten in place — no original
|
||||
// upload required, which also covers songs from before export support.
|
||||
//
|
||||
// The same pass also corrects the stored catalog values that were fabricated rather than
|
||||
// derived from official masterdata (see below): the looping PLAY cue, the per-song score-rank
|
||||
// thresholds and the combo-mission targets.
|
||||
//
|
||||
// For each song directory with a catalog row, every chart with an over-shared num is
|
||||
// regrouped (chart::regroup), rewritten to disk, and its level's md5/size in the catalog
|
||||
// blob updated — the changed md5 re-keys the client's content-addressed cache, so clients
|
||||
// re-download the fixed chart on their next catalog sync. The revision is bumped ONCE if
|
||||
// anything changed. Charts the current transcoder produced (and official-shaped encodings)
|
||||
// are left byte-identical, so re-running every boot is free.
|
||||
pub fn run() {
|
||||
if super::disabled() {
|
||||
return;
|
||||
}
|
||||
let Ok(entries) = fs::read_dir(get_data_path("custom_songs")) else {
|
||||
// No custom_songs directory yet - nothing was ever uploaded
|
||||
return;
|
||||
};
|
||||
|
||||
let mut music_ids: Vec<i64> = entries.flatten()
|
||||
.filter_map(|entry| entry.file_name().to_string_lossy().parse::<i64>().ok())
|
||||
.collect();
|
||||
music_ids.sort();
|
||||
|
||||
let mut songs_changed = 0;
|
||||
let mut charts_changed = 0;
|
||||
for music_id in music_ids {
|
||||
// A song directory without a catalog row is never served; leave it alone
|
||||
let Some(mut song) = database::get_song(music_id) else { continue; };
|
||||
|
||||
let mut changed = false;
|
||||
|
||||
// Catalogs written before cue_json took an is_loop argument marked BOTH cues as loop
|
||||
// cues. A looping PLAY cue never reports playback-end to the client, and the live's end
|
||||
// trigger (LiveTimeController: isMusicEnded -> InLiveDelay -> EndWait) hangs off exactly
|
||||
// that, so those lives never finish. Only the metadata changes - the ogg bytes and their
|
||||
// md5 are untouched, so no re-download is needed, just a catalog resync.
|
||||
if song["sound"]["play"]["is_loop"] == true {
|
||||
song["sound"]["play"]["is_loop"] = false.into();
|
||||
song["sound"]["play"]["loop_end_sec"] = 0.0.into();
|
||||
changed = true;
|
||||
println!("Custom song {}: play cue un-looped (pre-fix catalog)", music_id);
|
||||
}
|
||||
|
||||
// Score-rank thresholds and combo-mission targets used to be invented per song. Both are
|
||||
// objective masterdata: the official live rows all carry ONE score tuple, and every
|
||||
// live_mission_combo row is round(hardest full combo * 0.2/0.4/0.6/0.8) (see
|
||||
// default_scores / mission_combo). Recompute them the way an edit would, so songs
|
||||
// uploaded before the fix stop handing out rank S for free and stop asking for a literal
|
||||
// full combo on the fourth combo mission.
|
||||
let (score, multi_score) = super::default_scores();
|
||||
if song["score"] != score || song["multi_score"] != multi_score {
|
||||
song["score"] = score;
|
||||
song["multi_score"] = multi_score;
|
||||
changed = true;
|
||||
println!("Custom song {}: score rank thresholds reset to the official values", music_id);
|
||||
}
|
||||
// Same "hardest difficulty" rule as upload/edit: the last level entry, which both write
|
||||
// in ascending level order
|
||||
if let Some(hardest) = song["levels"].members().last().and_then(|l| l["full_combo"].as_i64()) {
|
||||
let missions = super::mission_combo(hardest);
|
||||
if song["mission_combo"] != missions {
|
||||
song["mission_combo"] = missions;
|
||||
changed = true;
|
||||
println!("Custom song {}: combo missions rescaled to the official 20/40/60/80%", music_id);
|
||||
}
|
||||
}
|
||||
|
||||
for level in 1..=LEVEL_COUNT {
|
||||
let path = song_path(music_id, &format!("chart_{}.json", level));
|
||||
let Ok(bytes) = fs::read(&path) else { continue; };
|
||||
let Ok(mut chart_data) = jzon::parse(&String::from_utf8_lossy(&bytes)) else {
|
||||
println!("Custom song {} chart {}: not valid JSON, migration skipped", music_id, level);
|
||||
continue;
|
||||
};
|
||||
if !chart::regroup(&mut chart_data) {
|
||||
continue;
|
||||
}
|
||||
let new_bytes = jzon::stringify(chart_data);
|
||||
if let Err(e) = fs::write(&path, &new_bytes) {
|
||||
println!("Custom song {} chart {}: rewrite failed ({}), migration skipped", music_id, level, e);
|
||||
continue;
|
||||
}
|
||||
// The catalog md5/size must follow the served bytes or the client's
|
||||
// download-and-verify loop would never accept the asset
|
||||
let (md5, size) = asset_meta(new_bytes.as_bytes());
|
||||
for entry in song["levels"].members_mut() {
|
||||
if entry["level"] == level {
|
||||
entry["md5"] = md5.clone().into();
|
||||
entry["size"] = size.into();
|
||||
}
|
||||
}
|
||||
changed = true;
|
||||
charts_changed += 1;
|
||||
println!("Custom song {}: regrouped chart level {} (pre-pairing spawn groups)", music_id, level);
|
||||
}
|
||||
|
||||
if changed {
|
||||
database::update_song(music_id, &song);
|
||||
songs_changed += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if songs_changed > 0 {
|
||||
database::bump_revision();
|
||||
println!("Custom song spawn-group migration: rewrote {} chart(s) in {} song(s), catalog revision bumped", charts_changed, songs_changed);
|
||||
}
|
||||
}
|
||||
90
src/router/custom_song/package.rs
Normal file
90
src/router/custom_song/package.rs
Normal file
@@ -0,0 +1,90 @@
|
||||
use std::collections::HashMap;
|
||||
use std::fs;
|
||||
use std::io::{Cursor, Read, Seek, Write};
|
||||
use zip::write::SimpleFileOptions;
|
||||
|
||||
use super::{song_path, LEVEL_COUNT};
|
||||
|
||||
// Export packages carry the ORIGINAL upload artifacts. SIF1 is the canonical
|
||||
// interchange format - the transcoded NoteData charts are derived data and are
|
||||
// never exported. Importing a package on another ew server replays the exact
|
||||
// same upload pipeline the multipart form uses. Layout of the zip:
|
||||
// manifest.json upload metadata, same schema as the multipart fields
|
||||
// jacket original jacket image bytes (png/jpg)
|
||||
// audio original audio bytes (ogg/mp3/wav)
|
||||
// chart_{level}.json SIF1-schema charts, level 1..4 (only uploaded levels)
|
||||
// visibility/shared_with/downloads_disabled are per-server settings and are
|
||||
// deliberately NOT part of the package.
|
||||
|
||||
pub fn build(music_id: i64) -> Result<Vec<u8>, String> {
|
||||
// Songs uploaded before export support have no original artifacts on disk
|
||||
let manifest = fs::read(song_path(music_id, "original/manifest.json"))
|
||||
.map_err(|_| String::from("This song was uploaded before export support and can't be downloaded"))?;
|
||||
|
||||
let mut zip = zip::ZipWriter::new(Cursor::new(Vec::new()));
|
||||
let options = SimpleFileOptions::default();
|
||||
let mut add = |name: &str, bytes: &[u8]| -> Result<(), String> {
|
||||
zip.start_file(name, options).map_err(|e| e.to_string())?;
|
||||
zip.write_all(bytes).map_err(|e| e.to_string())
|
||||
};
|
||||
|
||||
add("manifest.json", &manifest)?;
|
||||
for name in ["jacket", "audio"] {
|
||||
let bytes = fs::read(song_path(music_id, &format!("original/{}", name))).map_err(|e| e.to_string())?;
|
||||
add(name, &bytes)?;
|
||||
}
|
||||
for level in 1..=LEVEL_COUNT {
|
||||
let Ok(bytes) = fs::read(song_path(music_id, &format!("original/chart_{}.json", level))) else { continue; };
|
||||
add(&format!("chart_{}.json", level), &bytes)?;
|
||||
}
|
||||
|
||||
Ok(zip.finish().map_err(|e| e.to_string())?.into_inner())
|
||||
}
|
||||
|
||||
fn read_entry<R: Read + Seek>(archive: &mut zip::ZipArchive<R>, name: &str) -> Option<Vec<u8>> {
|
||||
let mut file = archive.by_name(name).ok()?;
|
||||
let mut bytes = Vec::new();
|
||||
file.read_to_end(&mut bytes).ok()?;
|
||||
Some(bytes)
|
||||
}
|
||||
|
||||
// Expands a package into the same field map the upload form produces - the zip
|
||||
// contents map 1:1 onto the multipart fields, so an import is just an upload
|
||||
// with its fields sourced from the package. Fields already present in the map
|
||||
// that the package also carries are overwritten (the package's metadata wins);
|
||||
// visibility/shared_with/downloads_disabled aren't packaged and stay untouched
|
||||
pub fn expand(package: &[u8], fields: &mut HashMap<String, Vec<u8>>) -> Result<(), String> {
|
||||
let mut archive = zip::ZipArchive::new(Cursor::new(package)).map_err(|_| String::from("Package is not a valid zip file"))?;
|
||||
|
||||
let manifest = read_entry(&mut archive, "manifest.json").ok_or(String::from("Package has no manifest.json"))?;
|
||||
let manifest = jzon::parse(&String::from_utf8_lossy(&manifest)).map_err(|_| String::from("Package manifest is not valid JSON"))?;
|
||||
if manifest["format"].as_i64() != Some(1) {
|
||||
return Err(String::from("Unsupported package format"));
|
||||
}
|
||||
|
||||
for key in ["name", "name_en", "short_name", "kana", "artist", "artist_en", "band_category", "attribute", "bpm", "preview_start_sec", "preview_length_sec"] {
|
||||
if !manifest[key].is_null() {
|
||||
fields.insert(key.to_string(), manifest[key].to_string().into_bytes());
|
||||
}
|
||||
}
|
||||
for data in manifest["levels"].members() {
|
||||
let Some(level) = data["level"].as_i64() else { continue; };
|
||||
if !data["level_number"].is_null() {
|
||||
fields.insert(format!("level_number_{}", level), data["level_number"].to_string().into_bytes());
|
||||
}
|
||||
}
|
||||
|
||||
fields.insert(String::from("jacket"), read_entry(&mut archive, "jacket").ok_or(String::from("Package has no jacket"))?);
|
||||
fields.insert(String::from("audio"), read_entry(&mut archive, "audio").ok_or(String::from("Package has no audio"))?);
|
||||
let mut has_chart = false;
|
||||
for level in 1..=LEVEL_COUNT {
|
||||
if let Some(chart) = read_entry(&mut archive, &format!("chart_{}.json", level)) {
|
||||
fields.insert(format!("chart_{}", level), chart);
|
||||
has_chart = true;
|
||||
}
|
||||
}
|
||||
if !has_chart {
|
||||
return Err(String::from("Package has no charts"));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
9
src/router/databases/csv-en/achievement.csv
Normal file
9
src/router/databases/csv-en/achievement.csv
Normal file
@@ -0,0 +1,9 @@
|
||||
_id,_achievementIdAndroid,_achievementIdIos,_masterReleaseLabelId
|
||||
Tutorial_Clear,CgkI58KMzscDEAIQAQ,tutorial,1
|
||||
Rank_3_Arrival,CgkI58KMzscDEAIQAg,rank3,1
|
||||
Rank_5_Arrival,CgkI58KMzscDEAIQAw,rank5,1
|
||||
Rank_10_Arrival,CgkI58KMzscDEAIQBA,rank10,1
|
||||
Rank_15_Arrival,CgkI58KMzscDEAIQBQ,rank15,1
|
||||
Rank_20_Arrival,CgkI58KMzscDEAIQBg,rank20,1
|
||||
Rank_25_Arrival,CgkI58KMzscDEAIQBw,rank25,1
|
||||
Rank_30_Arrival,CgkI58KMzscDEAIQCA,rank30,1
|
||||
|
33
src/router/databases/csv-en/adjust_tracking_list.csv
Normal file
33
src/router/databases/csv-en/adjust_tracking_list.csv
Normal file
@@ -0,0 +1,33 @@
|
||||
_id,_name,_trackingId,_trackingType,_value,_masterReleaseLabelId
|
||||
1,USERNAME_COMPLETE,cxaf1k,1,,1
|
||||
2,TUTORIAL_COMPLETE,usrdzo,2,,1
|
||||
3,LOGIN_BONUS,253c9m,3,,1
|
||||
4,PURCHASE,1bsthi,4,,1
|
||||
5,INITIAL_PURCHASE,ydtj0o,5,,1
|
||||
6,RANK_005,gd5k9i,6,5,1
|
||||
7,RANK_010,32vmx1,6,10,1
|
||||
8,RANK_030,o7jsyo,6,30,1
|
||||
9,RANK_050,a8x3q0,6,50,1
|
||||
10,RANK_100,2t4qed,6,100,1
|
||||
11,RANK_200,6910uf,6,200,1
|
||||
12,RANK_300,z7sc9p,6,300,1
|
||||
13,STORYCLEAR_MS_01,xw39p7,7,10001001,223043005
|
||||
14,STORYCLEAR_MS_02,k0e5zr,7,10001002,223043005
|
||||
15,STORYCLEAR_MS_03,tbne9l,7,10001003,223043005
|
||||
16,STORYCLEAR_MS_04,ydfmv4,7,10001004,223043005
|
||||
17,STORYCLEAR_MS_05,v3kowc,7,10001005,223043005
|
||||
18,STORYCLEAR_AQOURS_01,1y4ciq,7,20001001,223051505
|
||||
19,STORYCLEAR_AQOURS_02,2x9bkp,7,20001002,223051505
|
||||
20,STORYCLEAR_AQOURS_03,l0ynyt,7,20001003,223051505
|
||||
21,STORYCLEAR_AQOURS_04,7fhbyg,7,20001004,223051505
|
||||
22,STORYCLEAR_AQOURS_05,mxlplg,7,20001005,223051505
|
||||
23,STORYCLEAR_NIJI_01,h9iti9,7,30001001,223053105
|
||||
24,STORYCLEAR_NIJI_02,c2bx53,7,30001002,223053105
|
||||
25,STORYCLEAR_NIJI_03,jxthtq,7,30001003,223053105
|
||||
26,STORYCLEAR_NIJI_04,thehu8,7,30001004,223053105
|
||||
27,STORYCLEAR_NIJI_05,g04pim,7,30001005,223053105
|
||||
28,STORYCLEAR_LIELLA_01,dcov5n,7,40001001,223041904
|
||||
29,STORYCLEAR_LIELLA_02,lpanui,7,40001002,223041904
|
||||
30,STORYCLEAR_LIELLA_03,yt1qhl,7,40001003,223041904
|
||||
31,STORYCLEAR_LIELLA_04,f74i28,7,40001004,223041904
|
||||
32,STORYCLEAR_LIELLA_05,vurijk,7,40001005,223041904
|
||||
|
7248
src/router/databases/csv-en/album_card_m.csv
Normal file
7248
src/router/databases/csv-en/album_card_m.csv
Normal file
File diff suppressed because it is too large
Load Diff
164
src/router/databases/csv-en/album_member_tag_m.csv
Normal file
164
src/router/databases/csv-en/album_member_tag_m.csv
Normal file
@@ -0,0 +1,164 @@
|
||||
_memberTagId,_name,_imgAsset,_masterReleaseLabelId
|
||||
4,μ's,BundleObjects/UnitLogo/unit_100,1
|
||||
5,Aqours,BundleObjects/UnitLogo/unit_200,1
|
||||
6,Printemps,BundleObjects/UnitLogo/unit_101,1
|
||||
7,lily white,BundleObjects/UnitLogo/unit_102,1
|
||||
8,BiBi,BundleObjects/UnitLogo/unit_103,1
|
||||
9,CYaRon!,BundleObjects/UnitLogo/unit_201,1
|
||||
10,AZALEA,BundleObjects/UnitLogo/unit_202,1
|
||||
11,Guilty Kiss,BundleObjects/UnitLogo/unit_203,1
|
||||
12,A-RISE,,1
|
||||
13,Saint Snow,,1
|
||||
14,Honoka,,1
|
||||
15,Hanayo,,1
|
||||
16,Nico,,1
|
||||
17,Kotori,,1
|
||||
18,Maki,,1
|
||||
19,Umi,,1
|
||||
20,Rin,,1
|
||||
21,Nozomi,,1
|
||||
22,Eli,,1
|
||||
23,Honoka & Rin,,1
|
||||
24,Nozomi & Nico,,1
|
||||
25,Kotori & Hanayo,,1
|
||||
26,Kotori & Umi,,1
|
||||
27,Rin & Maki,,1
|
||||
28,Maki & Nico,,1
|
||||
29,Eli & Umi,,1
|
||||
30,Eli & Nozomi,,1
|
||||
31,Umi & Maki & Eli,,1
|
||||
32,Honoka & Kotori & Umi,,1
|
||||
33,Rin & Hanayo & Nico,,1
|
||||
34,Chika & Riko & You,,1
|
||||
35,Rin & Hanayo & Maki,,1
|
||||
36,Eli & Nico & Nozomi,,1
|
||||
37,Korekara no Someday Members,,1
|
||||
38,Hanamaru Kunikida & Ruby Kurosawa & Yoshiko Tsushima,,1
|
||||
39,Rin & Maki & Hanayo & Eli & Nozomi & Nico,,1
|
||||
40,Kanan & Dia & Mari,,1
|
||||
41,Chika,,1
|
||||
42,Riko,,1
|
||||
43,Kanan,,1
|
||||
44,Dia,,1
|
||||
45,You,,1
|
||||
46,Yoshiko,,1
|
||||
47,Hanamaru,,1
|
||||
48,Mari,,1
|
||||
49,Ruby,,1
|
||||
50,Transfer Student,,1
|
||||
51,Rival,,1
|
||||
52,Support Member,,1
|
||||
53,Riko Sakurauchi & Hanamaru Kunikida & Mari Ohara,,1
|
||||
54,Dia Kurosawa & Ruby Kurosawa,,1
|
||||
55,You Watanabe & Yoshiko Tsushima,,1
|
||||
56,Chika Takami & Kanan Matsuura,,1
|
||||
57,Saint Aqours Snow,,1
|
||||
58,CYaZALEA☆Kiss,,1
|
||||
60,Nijigasaki,BundleObjects/UnitLogo/unit_300.png,1
|
||||
61,Ayumu Uehara,,1
|
||||
62,Kasumi Nakasu,,1
|
||||
63,Shizuku Osaka,,1
|
||||
64,Karin Asaka,,1
|
||||
65,Ai Miyashita,,1
|
||||
66,Kanata Konoe,,1
|
||||
67,Setsuna Yuki,,1
|
||||
68,Emma Verde,,1
|
||||
69,Rina Tennoji,,1
|
||||
70,Shadowverse,,1
|
||||
71,"Honoka, Eli",,1
|
||||
72,"Honoka, Kotori",,1
|
||||
73,"Honoka, Umi",,1
|
||||
74,"Honoka, Rin",,1
|
||||
75,"Honoka, Maki",,1
|
||||
76,"Honoka, Nozomi",,1
|
||||
77,"Honoka, Hanayo",,1
|
||||
78,"Honoka, Nico",,1
|
||||
79,"Eli, Kotori",,1
|
||||
80,"Eli, Umi",,1
|
||||
81,"Eli, Rin",,1
|
||||
82,"Eli, Maki",,1
|
||||
83,"Eli, Nozomi",,1
|
||||
84,"Eli, Hanayo",,1
|
||||
85,"Eli, Nico",,1
|
||||
86,"Kotori, Umi",,1
|
||||
87,"Kotori, Rin",,1
|
||||
88,"Kotori, Maki",,1
|
||||
89,"Kotori, Nozomi",,1
|
||||
90,"Kotori, Hanayo",,1
|
||||
91,"Kotori, Nico",,1
|
||||
92,"Umi, Rin",,1
|
||||
93,"Umi, Maki",,1
|
||||
94,"Umi, Nozomi",,1
|
||||
95,"Umi, Hanayo",,1
|
||||
96,"Umi, Nico",,1
|
||||
97,"Rin, Maki",,1
|
||||
98,"Rin, Nozomi",,1
|
||||
99,"Rin, Hanayo",,1
|
||||
100,"Rin, Nico",,1
|
||||
101,"Maki, Nozomi",,1
|
||||
102,"Maki, Hanayo",,1
|
||||
103,"Maki, Nico",,1
|
||||
104,"Nozomi, Hanayo",,1
|
||||
105,"Nozomi, Nico",,1
|
||||
106,"Hanayo, Nico",,1
|
||||
107,"Chika, Riko",,1
|
||||
108,"Chika, Kanan",,1
|
||||
109,"Chika, Dia",,1
|
||||
110,"Chika, You",,1
|
||||
111,"Chika, Yoshiko",,1
|
||||
112,"Chika, Hanamaru",,1
|
||||
113,"Chika, Mari",,1
|
||||
114,"Chika, Ruby",,1
|
||||
115,"Riko, Kanan",,1
|
||||
116,"Riko, Dia",,1
|
||||
117,"Riko, You",,1
|
||||
118,"Riko, Yoshiko",,1
|
||||
119,"Riko, Hanayo",,1
|
||||
120,"Riko, Mari",,1
|
||||
121,"Riko, Ruby",,1
|
||||
122,"Kanan, Dia",,1
|
||||
123,"Kanan, You",,1
|
||||
124,"Kanan, Yoshiko",,1
|
||||
125,"Kanan, Hanamaru",,1
|
||||
126,"Kanan, Mari",,1
|
||||
127,"Kanan, Ruby",,1
|
||||
128,"Dia, You",,1
|
||||
129,"Dia, Yoshiko",,1
|
||||
130,"Dia, Hanamaru",,1
|
||||
131,"Dia, Mari",,1
|
||||
132,"Dia, Ruby",,1
|
||||
133,"You, Yoshiko",,1
|
||||
134,"You, Hanamaru",,1
|
||||
135,"You, Mari",,1
|
||||
136,"You, Ruby",,1
|
||||
137,"Yoshiko, Hanamaru",,1
|
||||
138,"Yoshiko, Mari",,1
|
||||
139,"Yoshiko, Ruby",,1
|
||||
140,"Hanamaru, Mari",,1
|
||||
141,"Hanamaru, Ruby",,1
|
||||
142,"Mari, Ruby",,1
|
||||
143,Liella!,BundleObjects/UnitLogo/unit_400.png,1
|
||||
144,Crayon Shin-chan,,1
|
||||
145,Persona,,1
|
||||
146,Sunny Passion,,1
|
||||
147,Code Geass,,1
|
||||
148,Riko Sakurauchi & You Watanabe,,1
|
||||
149,Kanan Matsuura & Mari Ohara,,1
|
||||
150,Hanamaru Kunikida & Ruby Kurosawa,,1
|
||||
151,Chika Takami & Dia Kurosawa & Yoshiko Tsushima,,1
|
||||
152,School Idol Musical,,1
|
||||
1000,DiverDiva,,1
|
||||
1001,A·ZU·NA,,1
|
||||
1002,QU4RTZ,,1
|
||||
2000,Shioriko,,1
|
||||
2001,Mia,,1
|
||||
2002,Lanzhu,,1
|
||||
3000,Kanon,,1
|
||||
3001,Keke,,1
|
||||
3002,Chisato,,1
|
||||
3003,Sumire,,1
|
||||
3004,Ren,,1
|
||||
3005,Kinako,,1
|
||||
3006,Mei,,1
|
||||
3007,Shiki,,1
|
||||
3008,Natsumi,,1
|
||||
|
151
src/router/databases/csv-en/album_multi_unit_m.csv
Normal file
151
src/router/databases/csv-en/album_multi_unit_m.csv
Normal file
@@ -0,0 +1,151 @@
|
||||
_multiUnitId,_unitId,_unitNumber,_eponym,_name,_multiCardName,_masterReleaseLabelId
|
||||
1,2227,2227,The Power to Grant,Honoka Kosaka,still_1,1
|
||||
1,2228,2228,Seeking the Shine,Chika Takami,still_1,1
|
||||
2,2251,2251,Restful Vacation,Eli Ayase,still_2,1
|
||||
2,2252,2252,Pressed Maple Leaves,Nozomi Tojo,still_2,1
|
||||
3,2253,2253,Fallen Angel's Nap,Yoshiko Tsushima,still_3,1
|
||||
3,2254,2254,A Blissful Bathtime,Hanamaru Kunikida,still_3,1
|
||||
4,2387,2387,Your Natural Smile,Rin Hoshizora,still_4,1
|
||||
4,2388,2388,Precious Memories,Hanayo Koizumi,still_4,1
|
||||
5,2401,2401,A Sunny Smile,Chika Takami,still_5,1
|
||||
5,2402,2402,A Special Wreath,You Watanabe,still_5,1
|
||||
6,2415,2415,A Cute Finish,Kotori Minami,still_6,1
|
||||
6,2416,2416,Perfectly Precise,Umi Sonoda,still_6,1
|
||||
7,2433,2433,Shoulder to Shoulder,Dia Kurosawa,still_7,1
|
||||
7,2434,2434,With My Dear Big Sis,Ruby Kurosawa,still_7,1
|
||||
8,2448,2448,My True Wish,Maki Nishikino,still_8,1
|
||||
8,2449,2449,Heartfelt Wish,Nico Yazawa,still_8,1
|
||||
9,2464,2464,I'll Be Your Escort!,Kanan Matsuura,still_9,1
|
||||
9,2465,2465,Becoming a Bride,Mari Ohara,still_9,1
|
||||
10,2477,2477,Colorful Design,Honoka Kosaka,still_10,1
|
||||
10,2478,2478,Time To Cool Off,Eli Ayase,still_10,1
|
||||
11,2494,2494,Little Demon's Blessing,Riko Sakurauchi,still_11,1
|
||||
11,2495,2495,Flames in the Night,Yoshiko Tsushima,still_11,1
|
||||
12,2500,2500,Secret Dessert,Nozomi Tojo,still_12,1
|
||||
12,2501,2501,Let Nico Handle It♪,Nico Yazawa,still_12,1
|
||||
13,2510,2510,Making Progress♪,Dia Kurosawa,still_13,1
|
||||
13,2511,2511,The SS You Float♪,You Watanabe,still_13,1
|
||||
14,2518,2518,Shocking Spice,Maki Nishikino,still_14,1
|
||||
14,2519,2519,Party Popper Prank,Hanayo Koizumi,still_14,1
|
||||
15,2534,2534,Choosing with Me,Hanamaru Kunikida,still_15,1
|
||||
15,2535,2535,Temp Tattoo Trial,Ruby Kurosawa,still_15,1
|
||||
16,2542,2542,Autumn Gift,Honoka Kosaka,still_16,1
|
||||
16,2543,2543,Enthusiasm for You,Kotori Minami,still_16,1
|
||||
17,2557,2557,Perfect for a Walk,Chika Takami,still_17,1
|
||||
17,2558,2558,Pre-Winter Wish,Kanan Matsuura,still_17,1
|
||||
18,2566,2566,With You,Umi Sonoda,still_18,1
|
||||
18,2567,2567,Prankster's Mindset,Rin Hoshizora,still_18,1
|
||||
19,2576,2576,What I Wish For,Riko Sakurauchi,still_19,1
|
||||
19,2577,2577,Our Duet,Mari Ohara,still_19,1
|
||||
20,2598,2598,Holy Bells,Eli Ayase,still_20,1
|
||||
20,2599,2599,"Are You There, God?",Nico Yazawa,still_20,1
|
||||
21,2616,2616,Fallen Angel's Sash,Dia Kurosawa,still_21,1
|
||||
21,2617,2617,Lend Me Your Power,Yoshiko Tsushima,still_21,1
|
||||
22,2626,2626,Sweet Happenings,Honoka Kosaka,still_22,1
|
||||
22,2627,2627,Sweet Chocolate Trap,Maki Nishikino,still_22,1
|
||||
23,2647,2647,A Major Mix-Up?!,You Watanabe,still_23,1
|
||||
23,2648,2648,In With Good Fortune,Ruby Kurosawa,still_23,1
|
||||
24,2654,2654,Sweet Selection,Kotori Minami,still_24,1
|
||||
24,2655,2655,Open Your Heart,Rin Hoshizora,still_24,1
|
||||
25,2664,2664,Cherry Blossom Poems,Chika Takami,still_25,1
|
||||
25,2665,2665,Pink Hair Ornaments,Hanamaru Kunikida,still_25,1
|
||||
26,2673,2673,Sharing is Caring,Nozomi Tojo,still_26,1
|
||||
26,2674,2674,Berry Picking,Hanayo Koizumi,still_26,1
|
||||
27,2715,2715,I Wanna Take a Photo,Riko Sakurauchi,still_27,1
|
||||
27,2716,2716,A Sudden Photoshoot,Kanan Matsuura,still_27,1
|
||||
28,2798,2798,Take One!,Eli Ayase,still_28,1
|
||||
28,2799,2799,Sweet Recharge,Umi Sonoda,still_28,1
|
||||
29,2808,2808,Fish in the Sky,Dia Kurosawa,still_29,1
|
||||
29,2809,2809,Shiny Days♡,Mari Ohara,still_29,1
|
||||
30,2819,2819,Changing the Shot,Honoka Kosaka,still_30,1
|
||||
30,2820,2820,Warm-Hearted Care,Nico Yazawa,still_30,1
|
||||
31,2833,2833,Yohane's Essence,Yoshiko Tsushima,still_31,1
|
||||
31,2834,2834,After the Rain,Ruby Kurosawa,still_31,1
|
||||
32,2841,2841,Sea Arrangement,Kotori Minami,still_32,1
|
||||
32,2842,2842,Marine Treasure,Maki Nishikino,still_32,1
|
||||
33,2859,2859,Ramune Prank,Kanan Matsuura,still_33,1
|
||||
33,2860,2860,Feelings Into Words,You Watanabe,still_33,1
|
||||
34,2873,2873,Unrushed Shaved Ice,Rin Hoshizora,still_34,1
|
||||
34,2874,2874,Sweet Snow,Nozomi Tojo,still_34,1
|
||||
35,2905,2905,We've Got This,Riko Sakurauchi,still_35,1
|
||||
35,2906,2906,Hanamaru’s Challenge,Hanamaru Kunikida,still_35,1
|
||||
36,2942,2942,Solo Hike,Umi Sonoda,still_36,1
|
||||
36,2943,2943,Honey Nighttime,Hanayo Koizumi,still_36,1
|
||||
37,2981,2981,Fluffy Whipped Cream,Chika Takami,still_37,1
|
||||
37,2982,2982,Mari's Snuck Snacks♡,Mari Ohara,still_37,1
|
||||
38,2995,2995,Cutesy Surprise,Kotori Minami,still_38,1
|
||||
38,2996,2996,Prank Planning,Nico Yazawa,still_38,1
|
||||
39,3021,3021,Cute Stuff,Kanan Matsuura,still_39,1
|
||||
39,3022,3022,I Want You to Choose,Dia Kurosawa,still_39,1
|
||||
40,3053,3053,Big Sweets,Eli Ayase,still_40,1
|
||||
40,3054,3054,Baking Again,Maki Nishikino,still_40,1
|
||||
41,3128,3128,Awash in Cuteness,Mari Ohara,still_41,1
|
||||
41,3129,3129,A Thrilling Meal,Ruby Kurosawa,still_41,1
|
||||
42,3151,3151,Brilliant Night,Honoka Kosaka,still_42,1
|
||||
42,3152,3152,Candy Trap,Hanayo Koizumi,still_42,1
|
||||
43,3165,3165,Longing for Snow,Chika Takami,still_43,1
|
||||
43,3166,3166,Fall With the Snow,Yoshiko Tsushima,still_43,1
|
||||
44,3192,3192,New Year’s Treasure,Umi Sonoda,still_44,1
|
||||
44,3193,3193,Sweet Supplies,Nozomi Tojo,still_44,1
|
||||
45,3259,3259,Split Fifty-Fifty,You Watanabe,still_45,1
|
||||
45,3260,3260,Charming First Trip,Hanamaru Kunikida,still_45,1
|
||||
46,3270,3270,Surprise Trick,Rin Hoshizora,still_46,1
|
||||
46,3271,3271,Counter-Prank,Maki Nishikino,still_46,1
|
||||
47,3293,3293,Matching the Stage,Riko Sakurauchi,still_47,1
|
||||
47,3294,3294,Top Secret Training,Dia Kurosawa,still_47,1
|
||||
48,3313,3313,Try Again,Hanayo Koizumi,still_48,1
|
||||
48,3314,3314,Get Awesome Items!,Nico Yazawa,still_48,1
|
||||
49,3338,3338,Flower Parade,You Watanabe,still_49,1
|
||||
49,3339,3339,Handsome at Times,Mari Ohara,still_49,1
|
||||
50,3607,3607,Clamming Tips,Kanan Matsuura,still_50,1
|
||||
50,3608,3608,Tasty Premonition,Ruby Kurosawa,still_50,1
|
||||
51,3661,3661,Wind Chime,Kotori Minami,still_51,1
|
||||
51,3662,3662,Vivid Drawing,Hanayo Koizumi,still_51,1
|
||||
52,3712,3712,Because You Is Here,Riko Sakurauchi,still_52,1
|
||||
52,3713,3713,Joys of Ice and Sea,You Watanabe,still_52,1
|
||||
53,3748,3748,Splash Counter,Rin Hoshizora,still_53,1
|
||||
53,3749,3749,Splash Attack,Nico Yazawa,still_53,1
|
||||
54,3813,3813,Open Umbrella Season,Kanan Matsuura,still_54,1
|
||||
54,3814,3814,Rain-Proof Barrier,Yoshiko Tsushima,still_54,1
|
||||
55,3843,3843,Circle of Memories,Honoka Kosaka,still_55,1
|
||||
55,3844,3844,Surprise Visitor,Nozomi Tojo,still_55,1
|
||||
56,3861,3861,[Party]Taisho School Idol,Honoka Kosaka,still_56,1
|
||||
56,3862,3862,[Party]When Am I?,Hanayo Koizumi,still_56,1
|
||||
57,3863,3863,[Party]Simple Dress,Eli Ayase,still_57,1
|
||||
57,3864,3864,[Party]Until That Day Comes,Honoka Kosaka,still_57,1
|
||||
58,3865,3865,[Party]I'm Gonna Get You♪,Kotori Minami,still_58,1
|
||||
58,3866,3866,[Party]You're My Target♪,Eli Ayase,still_58,1
|
||||
59,3867,3867,[Party]I Won't Let You Down!,Umi Sonoda,still_59,1
|
||||
59,3868,3868,[Party]Song I Want To Play,Maki Nishikino,still_59,1
|
||||
60,3869,3869,[Party]Much Respect!,Rin Hoshizora,still_60,1
|
||||
60,3870,3870,[Party]Together is Better,Kotori Minami,still_60,1
|
||||
61,3871,3871,[Party]The Joy of This Moment,Maki Nishikino,still_61,1
|
||||
61,3872,3872,[Party]Earnest Emotion,Nozomi Tojo,still_61,1
|
||||
62,3873,3873,[Party]The Nozomi Set☆,Nozomi Tojo,still_62,1
|
||||
62,3874,3874,[Party]Toiling in the Shadows,Nico Yazawa,still_62,1
|
||||
63,3875,3875,[Party]Hanayo's Spring Outfit♪,Hanayo Koizumi,still_63,1
|
||||
63,3876,3876,[Party]Let's Go Play!,Rin Hoshizora,still_63,1
|
||||
64,3877,3877,[Party]Little Devil Training!,Nico Yazawa,still_64,1
|
||||
64,3878,3878,[Party]Little Devil's Line,Umi Sonoda,still_64,1
|
||||
65,3879,3879,[Party]Adorableness Appeal,Chika Takami,still_65,1
|
||||
65,3880,3880,[Party]Relaxing Spot,Ruby Kurosawa,still_65,1
|
||||
66,3881,3881,[Party]Happy Life,Riko Sakurauchi,still_66,1
|
||||
66,3882,3882,[Party]Lucky Charm,Mari Ohara,still_66,1
|
||||
67,3883,3883,[Party]Candy Shower,Kanan Matsuura,still_67,1
|
||||
67,3884,3884,[Party]Wandering Flames,Hanamaru Kunikida,still_67,1
|
||||
68,3885,3885,[Party]Shrine Maiden Steps,Dia Kurosawa,still_68,1
|
||||
68,3886,3886,[Party]Puppy Patrol,Kanan Matsuura,still_68,1
|
||||
69,3887,3887,[Party]Chasing the Bunny,You Watanabe,still_69,1
|
||||
69,3888,3888,"[Party]Hello, Wonder!",Riko Sakurauchi,still_69,1
|
||||
70,3889,3889,[Party]Underworld Ritual,Yoshiko Tsushima,still_70,1
|
||||
70,3890,3890,[Party]Halloween Party,Dia Kurosawa,still_70,1
|
||||
71,3891,3891,[Party]Unfading Beauty,Hanamaru Kunikida,still_71,1
|
||||
71,3892,3892,[Party]Orange Mermaid,Chika Takami,still_71,1
|
||||
72,3893,3893,[Party]Just for You,Mari Ohara,still_72,1
|
||||
72,3894,3894,[Party]Sinful Kiss,Yoshiko Tsushima,still_72,1
|
||||
73,3895,3895,[Party]Place of Wishes and Joy,Ruby Kurosawa,still_73,1
|
||||
73,3896,3896,[Party]Plus One Arrangement,You Watanabe,still_73,1
|
||||
74,3924,3924,A Nostalgic Book,Dia Kurosawa,still_74,1
|
||||
74,3925,3925,Dreaming a Story,Hanamaru Kunikida,still_74,1
|
||||
75,3950,3950,Night Mirror Image,Eli Ayase,still_75,1
|
||||
75,3951,3951,Flower Wreath Ring,Kotori Minami,still_75,1
|
||||
|
688
src/router/databases/csv-en/album_series_m.csv
Normal file
688
src/router/databases/csv-en/album_series_m.csv
Normal file
@@ -0,0 +1,688 @@
|
||||
_albumSeriesId,_albumGroupId,_albumTabId,_orderNum,_name,_nameEn,_layoutType,_thumbnailPath,_masterReleaseLabelId
|
||||
1,1,1,4,Akihabara,Akihabara,9,series_thumbnail_1_1,1
|
||||
2,1,1,8,Solo Stage Costumes,Solo Performance,9,series_thumbnail_2_1,1
|
||||
3,1,1,6,Jobs,Vocational,9,series_thumbnail_3_1,1
|
||||
4,1,1,9,Animals,Animal,3,series_thumbnail_4_1,1
|
||||
5,1,1,13,August (Swimsuits) Part 1,Summer Uniform (1/2),13,series_thumbnail_5_1,1
|
||||
6,1,1,14,August (Swimsuits) Part 2,Summer Uniform (2/2),12,series_thumbnail_6_1,1
|
||||
7,1,1,16,September (Yukata) Part 1,Yukata (1/2),13,series_thumbnail_7_1,1
|
||||
8,1,1,17,September (Yukata) Part 2,Yukata (2/2),12,series_thumbnail_8_1,1
|
||||
9,1,1,18,October (Cheerleaders) Part 1,Sports (1/2),13,series_thumbnail_9_1,1
|
||||
10,1,1,19,October (Cheerleaders) Part 2,Sports (2/2),12,series_thumbnail_10_1,1
|
||||
11,1,1,20,November (Cooking) Part 1,Cooking (1/2),13,series_thumbnail_11_1,1
|
||||
12,1,1,21,November (Cooking) Part 2,Cooking (2/2),12,series_thumbnail_12_1,1
|
||||
13,1,1,23,December (Santa) Part 1,Winter Holiday (1/2),13,series_thumbnail_13_1,1
|
||||
14,1,1,24,December (Santa) Part 2,Winter Holiday (2/2),12,series_thumbnail_14_1,1
|
||||
15,1,1,27,January (Sunday Best) Part 1,Kimono (1/2),13,series_thumbnail_15_1,1
|
||||
16,1,1,28,January (Sunday Best) Part 2,Kimono (2/2),12,series_thumbnail_16_1,1
|
||||
17,1,1,32,February (Valentine's) Part 1,Chocolate (1/2),13,series_thumbnail_17_1,1
|
||||
18,1,1,33,February (Valentine's) Part 2,Chocolate (2/2),12,series_thumbnail_18_1,1
|
||||
19,1,1,35,March (Flowers) Part 1,Blooming (1/2),13,series_thumbnail_19_1,1
|
||||
20,1,1,36,March (Flowers) Part 2,Blooming (2/2),12,series_thumbnail_20_1,1
|
||||
21,1,1,38,April (Fruit Stand) Part 1,Fruit Stand (1/2),13,series_thumbnail_21_1,1
|
||||
22,1,1,39,April (Fruit Stand) Part 2,Fruit Stand (2/2),12,series_thumbnail_22_1,1
|
||||
23,1,1,42,May (Fairy Tales) Part 1,Fairy Tale (1/2),13,series_thumbnail_23_1,1
|
||||
24,1,1,43,May (Fairy Tales) Part 2,Fairy Tale (2/2),12,series_thumbnail_24_1,1
|
||||
25,1,1,44,June (Dresses) Part 1,Party Dress (1/2),13,series_thumbnail_25_1,1
|
||||
26,1,1,45,June (Dresses) Part 2,Party Dress (2/2),12,series_thumbnail_26_1,1
|
||||
27,1,1,49,July (Mermaids) Part 1,Summer Casual (1/2),13,series_thumbnail_27_1,1
|
||||
28,1,1,50,July (Mermaids) Part 2,Summer Casual (2/2),12,series_thumbnail_28_1,1
|
||||
29,1,1,55,China Dresses Part 1,Kung Fu Star (1/2),13,series_thumbnail_29_1,1
|
||||
30,1,1,56,China Dresses Part 2,Kung Fu Star (2/2),12,series_thumbnail_30_1,1
|
||||
31,1,1,58,Café Maids Part 1,Cafe Maid (1/2),13,series_thumbnail_31_1,1
|
||||
32,1,1,59,Café Maids Part 2,Cafe Maid (2/2),12,series_thumbnail_32_1,1
|
||||
33,1,1,60,Halloween Part 1,Halloween (1/2),13,series_thumbnail_33_1,1
|
||||
34,1,1,61,Halloween Part 2,Halloween (2/2),12,series_thumbnail_34_1,1
|
||||
35,1,1,64,Constellations Part 1,Zodiac (1/2),13,series_thumbnail_35_1,1
|
||||
36,1,1,65,Constellations Part 2,Zodiac (2/2),12,series_thumbnail_36_1,1
|
||||
37,1,1,67,Snowy Mountain Part 1,Winter Sports (1/2),13,series_thumbnail_37_1,1
|
||||
38,1,1,68,Snowy Mountain Part 2,Winter Sports (2/2),12,series_thumbnail_38_1,1
|
||||
39,1,1,73,Seven Lucky Gods Part 1,Goddesses of Fortune (1/2),13,series_thumbnail_39_1,1
|
||||
40,1,1,74,Seven Lucky Gods Part 2,Goddesses of Fortune (2/2),12,series_thumbnail_40_1,1
|
||||
41,1,1,76,Valentine's Part 1,Valentines (1/2),13,series_thumbnail_41_1,1
|
||||
42,1,1,77,Valentine's Part 2,Valentines (2/2),12,series_thumbnail_42_1,1
|
||||
43,1,1,78,White Day Part 1,White Day (1/2),13,series_thumbnail_43_1,1
|
||||
44,1,1,79,White Day Part 2,White Day (2/2),12,series_thumbnail_44_1,1
|
||||
45,1,1,82,Work Study Part 1,Vocational Part 2 (1/2),13,series_thumbnail_45_1,1
|
||||
46,1,1,83,Work Study Part 2,Vocational Part 2 (2/2),12,series_thumbnail_46_1,1
|
||||
47,1,1,86,Cyber Part 1,Cyber (1/2),13,series_thumbnail_47_1,1
|
||||
48,1,1,87,Cyber Part 2,Cyber (2/2),12,series_thumbnail_48_1,1
|
||||
49,1,1,89,Magicians Part 1,Magician (1/2),13,series_thumbnail_49_1,1
|
||||
50,1,1,90,Magicians Part 2,Magician (2/2),12,series_thumbnail_50_1,1
|
||||
51,1,1,94,Mariners Part 1,Sailors (1/2),13,series_thumbnail_51_1,1
|
||||
52,1,1,95,Mariners Part 2,Sailors (2/2),12,series_thumbnail_52_1,1
|
||||
53,1,1,96,Poolside Part 1,Swimming Pool (1/2),13,series_thumbnail_53_1,1
|
||||
54,1,1,97,Poolside Part 2,Swimming Pool (2/2),12,series_thumbnail_54_1,1
|
||||
55,1,1,98,Kunoichi Part 1,Kunoichi (1/2),13,series_thumbnail_55_1,1
|
||||
56,1,1,99,Kunoichi Part 2,Kunoichi (2/2),12,series_thumbnail_56_1,1
|
||||
57,1,1,103,Petting Zoo Part 1,Animal Part 2 (1/2),13,series_thumbnail_57_1,1
|
||||
58,1,1,104,Petting Zoo Part 2,Animal Part 2 (2/2),12,series_thumbnail_58_1,1
|
||||
59,1,1,107,Formal Ball Part 1,Dance Party (1/2),13,series_thumbnail_59_1,1
|
||||
60,1,1,108,Formal Ball Part 2,Dance Party (2/2),12,series_thumbnail_60_1,1
|
||||
61,1,1,110,Christmas Part 1,Christmas (1/2),13,series_thumbnail_61_1,1
|
||||
62,1,1,111,Christmas Part 2,Christmas (2/2),12,series_thumbnail_62_1,1
|
||||
63,1,1,115,Circus Part 1,Circus (1/2),13,series_thumbnail_63_1,1
|
||||
64,1,1,116,Circus Part 2,Circus (2/2),12,series_thumbnail_64_1,1
|
||||
65,1,1,119,Fairyland Part 1,Fairyland (1/2),13,series_thumbnail_65_1,1
|
||||
66,1,1,120,Fairyland Part 2,Fairyland (2/2),12,series_thumbnail_66_1,1
|
||||
67,1,1,124,Classical Japanese Part 1,Taisho Roman (1/2),13,series_thumbnail_67_1,1
|
||||
68,1,1,125,Classical Japanese Part 2,Taisho Roman (2/2),12,series_thumbnail_68_1,1
|
||||
69,1,1,127,Baseball Part 1,Baseball (1/2),13,series_thumbnail_69_1,1
|
||||
70,1,1,128,Baseball Part 2,Baseball (2/2),12,series_thumbnail_70_1,1
|
||||
71,1,1,130,Dancers Part 1,Dancer (1/2),13,series_thumbnail_71_1,1
|
||||
72,1,1,131,Dancers Part 2,Dancer (2/2),12,series_thumbnail_72_1,1
|
||||
73,1,1,132,Idol Outfits Part 1,Idol Costume (1/2),13,series_thumbnail_73_1,1
|
||||
74,1,1,133,Idol Outfits Part 2,Idol Costume (2/2),12,series_thumbnail_74_1,1
|
||||
75,1,1,135,Little Devils Part 1,Little Devil (1/2),13,series_thumbnail_75_1,1
|
||||
76,1,1,136,Little Devils Part 2,Little Devil (2/2),12,series_thumbnail_76_1,1
|
||||
77,1,1,138,Pool Prep Part 1,Ready for Summer (1/2),15,series_thumbnail_77_1,1
|
||||
78,1,1,139,Pool Prep Part 2,Ready for Summer (2/2),14,series_thumbnail_78_1,1
|
||||
79,1,1,140,Birthstones Part 1,Birth Stones (1/2),15,series_thumbnail_79_1,1
|
||||
80,1,1,141,Birthstones Part 2,Birth Stones (2/2),14,series_thumbnail_80_1,1
|
||||
81,1,1,144,Slumber Party Part 1,Pajama Party (1/2),15,series_thumbnail_81_1,1
|
||||
82,1,1,145,Slumber Party Part 2,Pajama Party (2/2),14,series_thumbnail_82_1,1
|
||||
83,1,1,146,Bouquets Part 1,Bouquet (1/2),15,series_thumbnail_83_1,1
|
||||
84,1,1,147,Bouquets Part 2,Bouquet (2/2),14,series_thumbnail_84_1,1
|
||||
85,1,1,149,Tennis Part 1,Tennis (1/2),15,series_thumbnail_85_1,1
|
||||
86,1,1,150,Tennis Part 2,Tennis (2/2),14,series_thumbnail_86_1,1
|
||||
87,1,1,151,Ice Cream Part 1,Ice Cream (1/2),15,series_thumbnail_87_1,1
|
||||
88,1,1,152,Ice Cream Part 2,Ice Cream (2/2),14,series_thumbnail_88_1,1
|
||||
89,1,1,154,Pirates Part 1,Pirates (1/2),15,series_thumbnail_89_1,1
|
||||
90,1,1,155,Pirates Part 2,Pirates (2/2),14,series_thumbnail_90_1,1
|
||||
91,1,1,156,Crayons Part 1,Crayon (1/2),15,series_thumbnail_91_1,1
|
||||
92,1,1,157,Crayons Part 2,Crayon (2/2),14,series_thumbnail_92_1,1
|
||||
93,1,1,160,Instruments Part 1,Marching Band (1/2),15,series_thumbnail_93_1,1
|
||||
94,1,1,161,Instruments Part 2,Marching Band (2/2),14,series_thumbnail_94_1,1
|
||||
95,1,1,163,Sky Part 1,Clear Skies (1/2),15,series_thumbnail_95_1,1
|
||||
96,1,1,164,Sky Part 2,Clear Skies (2/2),14,series_thumbnail_96_1,1
|
||||
97,1,1,167,Wonderland Part 1,A Curious Place (1/2),15,series_thumbnail_97_1,1
|
||||
98,1,1,168,Wonderland Part 2,A Curious Place (2/2),14,series_thumbnail_98_1,1
|
||||
99,1,1,170,Sorceresses Part 1,Witches (1/2),15,series_thumbnail_99_1,1
|
||||
100,1,1,171,Sorceresses Part 2,Witches (2/2),14,series_thumbnail_100_1,1
|
||||
101,1,1,173,Fruits Part 1,Fruits (1/2),15,series_thumbnail_101_1,1
|
||||
102,1,1,174,Fruits Part 2,Fruits (2/2),14,series_thumbnail_102_1,1
|
||||
103,1,1,178,Universe Part 1,Universe (1/2),15,series_thumbnail_103_1,1
|
||||
104,1,1,179,Universe Part 2,Universe (2/2),14,series_thumbnail_104_1,1
|
||||
105,1,1,180,RPG Part 1,RPG (1/2),15,series_thumbnail_105_1,1
|
||||
106,1,1,181,RPG Part 2,RPG (2/2),14,series_thumbnail_106_1,1
|
||||
107,1,1,184,Tea Party Part 1,Tea Party (1/2),15,series_thumbnail_107_1,1
|
||||
108,1,1,185,Tea Party Part 2,Tea Party (2/2),14,series_thumbnail_108_1,1
|
||||
109,1,1,187,Spring Arrives Part 1,Welcome Spring (1/2),15,series_thumbnail_109_1,1
|
||||
110,1,1,188,Spring Arrives Part 2,Welcome Spring (2/2),14,series_thumbnail_110_1,1
|
||||
111,1,1,190,Marbles Part 1,Marble (1/2),15,series_thumbnail_111_1,1
|
||||
112,1,1,191,Marbles Part 2,Marble (2/2),14,series_thumbnail_112_1,1
|
||||
113,1,1,193,Tropical Part 1,Tropical Adventure (1/2),15,series_thumbnail_113_1,1
|
||||
114,1,1,194,Tropical Part 2,Tropical Adventure (2/2),14,series_thumbnail_114_1,1
|
||||
115,1,1,196,Studies Part 1,Time to Study (1/2),15,series_thumbnail_115_1,1
|
||||
116,1,1,197,Studies Part 2,Time to Study (2/2),14,series_thumbnail_116_1,1
|
||||
117,1,1,198,White Snow Part 1,Sparkling Snow (1/2),15,series_thumbnail_117_1,1
|
||||
118,1,1,199,White Snow Part 2,Sparkling Snow (2/2),14,series_thumbnail_118_1,1
|
||||
119,1,1,203,Make-Up Magic,Makeup's Magic (1/2),15,series_thumbnail_119_1,1
|
||||
120,1,1,201,Birthday Surprise!,Birthday Surprise,9,series_thumbnail_120_8,1
|
||||
121,1,1,202,SIF Thanksgiving 2019,Fan Festival 2019,9,series_thumbnail_121_8,1
|
||||
122,1,1,192,Starlight Sailors<br>(SIF AC),Starlight Sailor,9,series_thumbnail_122_1,1
|
||||
123,1,1,186,Smile Parade,Smile Parade,9,series_thumbnail_123_1,1
|
||||
124,1,1,183,Birthday Live Show,Birthday Live Show,9,series_thumbnail_124_1,1
|
||||
125,1,1,165,Bokutachi wa Hitotsu no Hikari (UR),Bokutachi wa Hitotsu no Hikari (UR),9,series_thumbnail_125_1,1
|
||||
126,1,1,159,School Unity<br>(SIF AC),School Unity,9,series_thumbnail_126_1,1
|
||||
127,1,1,162,SIF AC 2017<br>Birthday,SIF-AC Birthday 2017,9,series_thumbnail_127_1,1
|
||||
128,1,1,172,Birthday Dresses,Birthday 2019,9,series_thumbnail_128_1,1
|
||||
129,1,1,137,KiRa-KiRa Sensation!<br>(SSR),KiRa-KiRa Sensation!<br>(SSR),9,series_thumbnail_0_1,1
|
||||
130,1,1,177,Shrine Maiden (SIF AC),Shrine Maiden,9,series_thumbnail_130_1,1
|
||||
131,1,1,5,Special Delivery Part 1,Special Release Part 1,10,series_thumbnail_0_1,1
|
||||
132,1,1,10,Special Delivery Part 2,Special Release Part 2,9,series_thumbnail_132_1,1
|
||||
133,1,1,11,Special Delivery Part 3,Special Release Part 3,9,series_thumbnail_133_1,1
|
||||
134,1,1,30,Special Delivery Part 7,Special Release Part 7,9,series_thumbnail_134_1,1
|
||||
135,1,1,31,Takaramonos / <br>Paradise Live (SR),Takaramonos/<br>Paradise Live (SR),9,series_thumbnail_135_1,1
|
||||
136,1,1,41,It's our miraculous time (R),It's our miraculous time (R),9,series_thumbnail_136_1,1
|
||||
137,1,1,47,Special Delivery Part 9,Special Release Part 9,10,series_thumbnail_0_1,1
|
||||
138,1,1,57,Special Delivery Part 13,Special Release Part 13,8,series_thumbnail_138_1,1
|
||||
139,1,1,75,Special Delivery Part 14,Special Release Part 14,9,series_thumbnail_139_1,1
|
||||
140,1,1,91,Special Delivery Part 17,Special Release Part 17,9,series_thumbnail_140_1,1
|
||||
141,1,1,92,Special Delivery Part 18,Special Release Part 18,9,series_thumbnail_141_1,1
|
||||
142,1,1,105,HEART to HEART! (SR),HEART to HEART! (SR),9,series_thumbnail_142_1,1
|
||||
143,1,1,123,MOMENT RING (SR),MOMENT RING (SR),9,series_thumbnail_143_1,1
|
||||
144,1,1,63,Printemps Live Show,Printemps Live Show,3,series_thumbnail_144_1,1
|
||||
145,1,1,66,lily white Live Show,lily white Live Show,3,series_thumbnail_145_1,1
|
||||
146,1,1,71,BiBi Live Show,BiBi Live Show,3,series_thumbnail_146_1,1
|
||||
147,1,1,109,Printemps<br>WAO-WAO Powerful Day!,Printemps<br>WAO-WAO Powerful day!,3,series_thumbnail_147_1,1
|
||||
148,1,1,114,lily white<br>Omoide Ijou ni Naritakute,lily white<br>Omoide Ijou ni Naritakute,3,series_thumbnail_148_1,1
|
||||
149,1,1,118,BiBi<BR>Sakkaku Crossroads,BiBi<br>Sakkaku CROSSROADS,3,series_thumbnail_149_1,1
|
||||
150,1,1,7,Event Reward (SR) Part 1,Event Reward (SR),9,series_thumbnail_150_1,1
|
||||
151,1,1,22,Event Reward (SR) Part 2,Event Reward (SR),9,series_thumbnail_151_1,1
|
||||
152,1,1,37,Event Reward (SR) Part 3,Event Reward (SR),9,series_thumbnail_152_1,1
|
||||
153,1,1,53,Event Reward (SR) Part 4,Event Reward (SR),9,series_thumbnail_153_1,1
|
||||
154,1,1,70,Event Reward (SR) Part 5,Event Reward (SR),9,series_thumbnail_154_1,1
|
||||
155,1,1,84,Event Reward (SR) Part 6,Event Reward (SR),9,series_thumbnail_155_1,1
|
||||
156,1,1,100,Event Reward (SR) Part 7,Event Reward (SR),9,series_thumbnail_156_1,1
|
||||
157,1,1,117,Event Reward (SR) Part 8,Event Reward (SR),9,series_thumbnail_157_1,1
|
||||
158,1,1,134,Event Reward (SR) Part 9,Event Reward (SR),9,series_thumbnail_158_1,1
|
||||
159,1,1,142,Event Reward (SR) Part 10,Event Reward (SR),9,series_thumbnail_159_1,1
|
||||
160,1,1,148,Event Reward (SR) Part 11,Event Reward (SR),9,series_thumbnail_160_1,1
|
||||
161,1,1,153,Event Reward (SR) Part 12,Event Reward (SR),9,series_thumbnail_161_1,1
|
||||
162,1,1,158,Event Reward (SR) Part 13,Event Reward (SR),9,series_thumbnail_162_1,1
|
||||
163,1,1,166,Event Reward (SR) Part 14,Event Reward (SR),9,series_thumbnail_163_1,1
|
||||
164,1,1,176,Event Reward (SR) Part 15,Event Reward (SR),9,series_thumbnail_164_1,1
|
||||
165,1,1,182,Event Reward (SR) Part 16,Event Reward (SR),9,series_thumbnail_165_1,1
|
||||
166,1,1,189,Event Reward (SR) Part 17,Event Reward (SR),9,series_thumbnail_166_1,1
|
||||
167,1,1,195,Event Reward (SR) Part 18,Event Reward (SR),9,series_thumbnail_167_1,1
|
||||
168,1,1,200,Best Besties Election,Companion Election,2,series_thumbnail_168_1,1
|
||||
169,1,1,29,NicoRinPana,Nico Rin Pana,6,series_thumbnail_169_1,1
|
||||
170,1,1,129,You Decide ♪ Request UR<br>Finals,Special Release,9,series_thumbnail_170_1,1
|
||||
171,1,1,12,Special Delivery Part 4,Special Release Part 4,1,series_thumbnail_0_1,1
|
||||
172,1,1,15,Special Delivery Part 5,Special Release Part 5,1,series_thumbnail_0_1,1
|
||||
173,1,1,25,Christmas Card<br>Finals,Christmas Girl,16,series_thumbnail_173_1,1
|
||||
174,1,1,26,Special Delivery Part 6,Special Release Part 6,1,series_thumbnail_0_1,1
|
||||
175,1,1,34,Special Delivery Part 8,Special Release Part 8,1,series_thumbnail_0_1,1
|
||||
176,1,1,48,Special Delivery Part 10,Special Release Part 10,1,series_thumbnail_176_1,1
|
||||
177,1,1,51,Special Delivery Part 11,Special Release Part 11,1,series_thumbnail_0_1,1
|
||||
178,1,1,52,Special Delivery Part 12,Special Release Part 12,1,series_thumbnail_0_1,1
|
||||
179,1,1,54,Summer Girl Championship,Summer Girl Election,1,series_thumbnail_179_1,1
|
||||
180,1,1,69,The Great Christmas Present Caper,Holiday Gift Extravaganza,1,series_thumbnail_180_1,1
|
||||
181,1,1,80,Special Delivery Part 15,Special Release Part 15,1,series_thumbnail_0_1,1
|
||||
182,1,1,85,I Wanna Go With You ♪ Travel Girl<br>Finals,Travel Girl Competition,1,series_thumbnail_182_1,1
|
||||
183,1,1,88,Special Delivery Part 16,Special Release Part 16,3,series_thumbnail_183_1,1
|
||||
184,1,1,93,Special Delivery Part 19,Special Release Part 19,1,series_thumbnail_0_1,1
|
||||
185,1,1,102,Special Delivery Part 20,Special Release Part 20,1,series_thumbnail_0_1,1
|
||||
186,1,1,106,Summertime Fruit Girl Finals,Summer Fruit Girl Competition,1,series_thumbnail_186_1,1
|
||||
187,1,1,112,Special Delivery Part 21,Special Release Part 21,1,series_thumbnail_0_1,1
|
||||
188,1,1,122,Special Delivery Part 22,Special Release Part 22,1,series_thumbnail_0_1,1
|
||||
189,1,1,126,Special Delivery Part 23,Special Release Part 23,1,series_thumbnail_0_1,1
|
||||
190,1,1,143,μ's Fan Meeting Tour 2015<br>Love Live! Comes to Your Town!,μ's Fan Meeting Tour 2015<br>〜LoveLive! in your Town〜,1,series_thumbnail_0_1,1
|
||||
191,1,1,169,SIF 5th Anniversary<br>Campaign Girl,5th Anniversary Celebration Girls,1,series_thumbnail_191_1,1
|
||||
192,1,1,175,Sega Staff Poster Girls,SEGA Staff Costume,1,series_thumbnail_0_1,1
|
||||
193,1,1,1,Wonderful Rush (R),Wonderful Rush (R),9,series_thumbnail_193_1,1
|
||||
194,1,1,2,"Mogyutto ""Love"" de Sekkinchu!<br>(R)","Mogyutto ""Love"" de Sekkinchu!<br> (R)",9,series_thumbnail_194_1,1
|
||||
195,1,1,3,"Natsuiro Egao de 1, 2, Jump! (R)","Natsuiro Egao de 1, 2, Jump! (R)",9,series_thumbnail_195_1,1
|
||||
196,1,1,40,Bokura wa Ima no Naka de (R),Bokura wa Ima no Naka de (R),9,series_thumbnail_196_1,1
|
||||
197,1,1,46,Snow Halation (R) Part 1,Snow Halation (R) Part 1,9,series_thumbnail_197_1,1
|
||||
198,1,1,62,Korekara no Someday (R),Korekara no Someday (R),9,series_thumbnail_198_1,1
|
||||
199,1,1,72,Yume no Tobira (R),Yume no Tobira (R),9,series_thumbnail_199_1,1
|
||||
200,1,1,81,Music S.T.A.R.T!! (R),Music S.T.A.R.T!! (R),9,series_thumbnail_200_1,1
|
||||
201,1,1,101,Dancing Stars on Me! (R),Dancing stars on me! (R),9,series_thumbnail_201_1,1
|
||||
202,1,1,113,KiRa-KiRa Sensation! (R),KiRa-KiRa Sensation! (R),9,series_thumbnail_202_1,1
|
||||
203,1,1,121,Snow Halation (R) Part 2,Snow Halation (R) Part 2,9,series_thumbnail_203_1,1
|
||||
204,2,1,208,Marine School,Marine School,9,series_thumbnail_204_1,1
|
||||
205,2,1,210,School Rocker,Rockin' School Idols,3,series_thumbnail_205_1,1
|
||||
206,2,1,211,Swimsuits Part 1,Swim Suit (1/2),15,series_thumbnail_206_1,1
|
||||
207,2,1,212,Swimsuits Part 2,Swim Suit (2/2),14,series_thumbnail_207_1,1
|
||||
208,2,1,213,Yukata Part 1,Yukata (1/2),15,series_thumbnail_208_1,1
|
||||
209,2,1,214,Yukata Part 2,Yukata (2/2),14,series_thumbnail_209_1,1
|
||||
210,2,1,215,Halloween Part 1,Trick or Treat (1/2),15,series_thumbnail_210_1,1
|
||||
211,2,1,216,Halloween Part 2,Trick or Treat (2/2),14,series_thumbnail_211_1,1
|
||||
212,2,1,218,Cheerleaders Part 1,Cheerleader (1/2),15,series_thumbnail_212_1,1
|
||||
213,2,1,219,Cheerleaders Part 2,Cheerleader (2/2),14,series_thumbnail_213_1,1
|
||||
214,2,1,220,Christmas Part 1,Christmas (1/2),15,series_thumbnail_214_1,1
|
||||
215,2,1,221,Christmas Part 2,Christmas (2/2),14,series_thumbnail_215_1,1
|
||||
216,2,1,224,Sunday Best Part 1,Haregi (1/2),15,series_thumbnail_216_1,1
|
||||
217,2,1,225,Sunday Best Part 2,Haregi (2/2),14,series_thumbnail_217_1,1
|
||||
218,2,1,226,Valentine's Part 1,Valentine's (1/2),15,series_thumbnail_218_1,1
|
||||
219,2,1,227,Valentine's Part 2,Valentine's (2/2),14,series_thumbnail_219_1,1
|
||||
220,2,1,228,Jobs Part 1,Vocational (1/2),15,series_thumbnail_220_1,1
|
||||
221,2,1,229,Jobs Part 2,Vocational (2/2),14,series_thumbnail_221_1,1
|
||||
222,2,1,231,Animals Part 1,Animal (1/2),15,series_thumbnail_222_1,1
|
||||
223,2,1,232,Animals Part 2,Animal (2/2),14,series_thumbnail_223_1,1
|
||||
224,2,1,233,Angels Part 1,Angel (1/2),15,series_thumbnail_224_1,1
|
||||
225,2,1,234,Angels Part 2,Angel (2/2),14,series_thumbnail_225_1,1
|
||||
226,2,1,235,Time Travelers Part 1,Time Travel (1/2),15,series_thumbnail_226_1,1
|
||||
227,2,1,236,Time Travelers Part 2,Time Travel (2/2),14,series_thumbnail_227_1,1
|
||||
228,2,1,238,Circus Part 1,Circus (1/2),15,series_thumbnail_228_1,1
|
||||
229,2,1,239,Circus Part 2,Circus (2/2),14,series_thumbnail_229_1,1
|
||||
230,2,1,242,Summer Beach Part 1,Summer Beach (1/2),15,series_thumbnail_230_1,1
|
||||
231,2,1,243,Summer Beach Part 2,Summer Beach (2/2),14,series_thumbnail_231_1,1
|
||||
232,2,1,244,Wonderland Part 1,A Curious Place (1/2),15,series_thumbnail_232_1,1
|
||||
233,2,1,245,Wonderland Part 2,A Curious Place (2/2),14,series_thumbnail_233_1,1
|
||||
234,2,1,247,Halloween Night Part 1,Halloween Festival (1/2),15,series_thumbnail_234_1,1
|
||||
235,2,1,248,Halloween Night Part 2,Halloween Festival (2/2),14,series_thumbnail_235_1,1
|
||||
236,2,1,250,Fall Leaf Hunters Part 1,Autumn Colors (1/2),15,series_thumbnail_236_1,1
|
||||
237,2,1,251,Fall Leaf Hunters Part 2,Autumn Colors (2/2),14,series_thumbnail_237_1,1
|
||||
238,2,1,252,Christmas Songs Part 1,Christmas Choir (1/2),15,series_thumbnail_238_1,1
|
||||
239,2,1,253,Christmas Songs Part 2,Christmas Choir (2/2),14,series_thumbnail_239_1,1
|
||||
240,2,1,256,New Year's Part 1,New Year's (1/2),15,series_thumbnail_240_1,1
|
||||
241,2,1,257,New Year's Part 2,New Year's (2/2),14,series_thumbnail_241_1,1
|
||||
242,2,1,259,After School Valentine Part 1,Valentine's Chocolate (1/2),15,series_thumbnail_242_1,1
|
||||
243,2,1,260,After School Valentine Part 2,Valentine's Chocolate (2/2),14,series_thumbnail_243_1,1
|
||||
244,2,1,262,Punk Rockers Part 1,Punk Rock (1/2),15,series_thumbnail_244_1,1
|
||||
245,2,1,263,Punk Rockers Part 2,Punk Rock (2/2),14,series_thumbnail_245_1,1
|
||||
246,2,1,266,Teachers Part 1,Teacher (1/2),15,series_thumbnail_246_1,1
|
||||
247,2,1,267,Teachers Part 2,Teacher (2/2),14,series_thumbnail_247_1,1
|
||||
248,2,1,269,Fairy Tales Part 1,Fairy Tale (1/2),15,series_thumbnail_248_1,1
|
||||
249,2,1,270,Fairy Tales Part 2,Fairy Tale (2/2),14,series_thumbnail_249_1,1
|
||||
250,2,1,274,Wedding Part 1,Wedding Dress (1/2),15,series_thumbnail_250_1,1
|
||||
251,2,1,275,Wedding Part 2,Wedding Dress (2/2),14,series_thumbnail_251_1,1
|
||||
252,2,1,278,Mermaids Part 1,Mermaid (1/2),15,series_thumbnail_252_1,1
|
||||
253,2,1,279,Mermaids Part 2,Mermaid (2/2),14,series_thumbnail_253_1,1
|
||||
254,2,1,281,Endless Summer Part 1,Tropical Summer (1/2),14,series_thumbnail_254_1,1
|
||||
255,2,1,282,Endless Summer Part 2,Tropical Summer (2/2),15,series_thumbnail_255_1,1
|
||||
256,2,1,285,China Dresses Part 1,Live in Chinatown (1/2),15,series_thumbnail_256_1,1
|
||||
257,2,1,286,China Dresses Part 2,Live in Chinatown (2/2),14,series_thumbnail_257_1,1
|
||||
258,2,1,290,Universe Part 1,Universe (1/2),15,series_thumbnail_258_1,1
|
||||
259,2,1,291,Universe Part 2,Universe (2/2),14,series_thumbnail_259_1,1
|
||||
260,2,1,293,Musicians of Bremen Part 1,Town Musicians of Bremen (1/2),15,series_thumbnail_260_1,1
|
||||
261,2,1,294,Musicians of Bremen Part 2,Town Musicians of Bremen (2/2),14,series_thumbnail_261_1,1
|
||||
262,2,1,296,Snow Fairies Part 1,Snow Fairy (1/2),15,series_thumbnail_262_1,1
|
||||
263,2,1,297,Snow Fairies Part 2,Snow Fairy (2/2),14,series_thumbnail_263_1,1
|
||||
264,2,1,300,New Year's Greetings Part 1,New Year's Countdown (1/2),15,series_thumbnail_264_1,1
|
||||
265,2,1,301,New Year's Greetings Part 2,New Year's Countdown (2/2),14,series_thumbnail_265_1,1
|
||||
266,2,1,306,Handmade Valentines Part 1,Valentine's Treats (1/2),15,series_thumbnail_266_1,1
|
||||
267,2,1,307,Handmade Valentines Part 2,Valentine's Treats (2/2),14,series_thumbnail_267_1,1
|
||||
268,2,1,309,Flowers Part 1,Flowers (1/2),15,series_thumbnail_268_1,1
|
||||
269,2,1,310,Flowers Part 2,Flowers (2/2),14,series_thumbnail_269_1,1
|
||||
270,2,1,313,Theme Park Part 1,Theme Park (1/2),15,series_thumbnail_270_1,1
|
||||
271,2,1,314,Theme Park Part 2,Theme Park (2/2),14,series_thumbnail_271_1,1
|
||||
272,2,1,316,Train Part 1,Trains (1/2),15,series_thumbnail_272_1,1
|
||||
273,2,1,317,Train Part 2,Trains (2/2),14,series_thumbnail_273_1,1
|
||||
274,2,1,318,Dancers Part 1,Dancer (1/2),15,series_thumbnail_274_1,1
|
||||
275,2,1,319,Dancers Part 2,Dancer (2/2),14,series_thumbnail_275_1,1
|
||||
276,2,1,321,Bubbles Part 1,Bubbles (1/2),15,series_thumbnail_276_1,1
|
||||
277,2,1,322,Bubbles Part 2,Bubbles (2/2),14,series_thumbnail_277_1,1
|
||||
278,2,1,324,Summer Nights Part 1,Night Pool (1/2),15,series_thumbnail_278_1,1
|
||||
279,2,1,325,Summer Nights Part 2,Night Pool (2/2),14,series_thumbnail_279_1,1
|
||||
280,2,1,328,Little Devils Part 1,Little Devil (1/2),15,series_thumbnail_280_1,1
|
||||
281,2,1,329,Little Devils Part 2,Little Devil (2/2),14,series_thumbnail_281_1,1
|
||||
282,2,1,332,Harvest Season Part 1,Autumn Harvest (1/2),15,series_thumbnail_282_1,1
|
||||
283,2,1,333,Harvest Season Part 2,Autumn Harvest (2/2),14,series_thumbnail_283_1,1
|
||||
284,2,1,335,Steampunk Part 1,Steampunk (1/2),15,series_thumbnail_284_1,1
|
||||
285,2,1,336,Steampunk Part 2,Steampunk (2/2),14,series_thumbnail_285_1,1
|
||||
286,2,1,337,Christmas Presents<br>Part 1,Christmas Present (1/2),15,series_thumbnail_286_1,1
|
||||
287,2,1,338,Christmas Presents<br>Part 2,Christmas Present (2/2),14,series_thumbnail_287_1,1
|
||||
288,2,1,340,Seven Lucky Gods Part 1,Goddesses of Fortune (1/2),15,series_thumbnail_288_1,1
|
||||
289,2,1,341,Seven Lucky Gods Part 2,Goddesses of Fortune (2/2),14,series_thumbnail_289_1,1
|
||||
290,2,1,342,Cat Café Part 1,Cat Cafe (1/2),15,series_thumbnail_290_1,1
|
||||
291,2,1,343,Cat Café Part 2,Cat Cafe (2/2),14,series_thumbnail_291_1,1
|
||||
292,2,1,327,Shiminnomori Camp<br>(SIF AC),Campsite,9,series_thumbnail_292_1,1
|
||||
293,2,1,311,Bright Sailors,Bright Sailor,9,series_thumbnail_293_1,1
|
||||
294,2,1,315,Birthday Live Show,Birthday 2019,9,series_thumbnail_294_1,1
|
||||
295,2,1,299,School Unity<br>(SIF AC),School Unity,9,series_thumbnail_295_1,1
|
||||
296,2,1,295,Worldwide Poster Girls,Worldwide Poster Girl,9,series_thumbnail_0_1,1
|
||||
297,2,1,283,2018 Birthdays UR Members,Birthday 2018,9,series_thumbnail_297_1,1
|
||||
298,2,1,249,Special Delivery Part 1,Special Release Part 1,9,series_thumbnail_0_1,1
|
||||
299,2,1,265,WATER BLUE NEW WORLD (UR),WATER BLUE NEW WORLD(UR),9,series_thumbnail_299_1,1
|
||||
300,2,1,209,1 Panel Comics,A Day in the Life,9,series_thumbnail_0_1,1
|
||||
301,2,1,254,Koini Naritai AQUARIUM<br>(SSR),Koini Naritai AQUARIUM<br>(SSR),9,series_thumbnail_0_1,1
|
||||
302,2,1,264,Real Escape Game Collab<br>Round 1,Real-Life Room Escape<br>Collaboration Part 1,9,series_thumbnail_0_1,1
|
||||
303,2,1,277,Mirai no Bokura wa Shitteru yo (SSR),Mirai no Bokura wa Shitteru yo<br>(SSR),9,series_thumbnail_303_1,1
|
||||
304,2,1,284,Fuji-Q Highland Collab,Fuji-Q Highland Collab,9,series_thumbnail_0_1,1
|
||||
305,2,1,287,Sega Collab,SEGA Collaboration,9,series_thumbnail_0_1,1
|
||||
306,2,1,298,SIF AC Next Stage,SIF-AC Next Stage,9,series_thumbnail_306_1,1
|
||||
307,2,1,302,Special Delivery Part 2,Special Release Part 2,9,series_thumbnail_307_1,1
|
||||
308,2,1,303,JOYSOUND Collab,JOYSOUND Collaboration,9,series_thumbnail_308_1,1
|
||||
309,2,1,305,Aqours Movie Opening Celebration,Aqours Movie Version<br>Re-Release Campaign,9,series_thumbnail_0_1,1
|
||||
310,2,1,308,Performing Worldwide Together<br>Challenge Completion Celebration,Simultaneous Worldwide Challenge Completion,9,series_thumbnail_310_1,1
|
||||
311,2,1,323,Real Escape Game Collab<br>Round 2,Real-Life Room Escape<br>Collaboration Part 2,9,series_thumbnail_0_1,1
|
||||
312,2,1,330,Shadowverse Collab,Shadowverse Collaboration,9,series_thumbnail_312_1,1
|
||||
313,2,1,271,CYaRon!<br>Genki Zenkai DAY! DAY! DAY!,CYaRon!<br>Genki Zenkai DAY! DAY! DAY!,3,series_thumbnail_313_1,1
|
||||
314,2,1,273,AZALEA<br>Torikoriko PLEASE!!,AZALEA<br>Torikoriko PLEASE!!,3,series_thumbnail_314_1,1
|
||||
315,2,1,276,Guilty Kiss<br>Strawberry Trapper,Guilty Kiss<br>Strawberry Trapper,3,series_thumbnail_315_1,1
|
||||
316,2,1,292,SIF Thanksgiving 2018<br>Sub-unit Showdown,SIF Fan Festival 2018 Team Match,3,series_thumbnail_316_1,1
|
||||
317,2,1,205,Event Reward (SR) Part 1,Event Reward (SR),9,series_thumbnail_317_1,1
|
||||
318,2,1,217,Event Reward (SR) Part 2,Event Reward (SR),9,series_thumbnail_318_1,1
|
||||
319,2,1,230,Event Reward (SR) Part 3,Event Reward (SR),9,series_thumbnail_319_1,1
|
||||
320,2,1,240,Event Reward (SR) Part 4,Event Reward (SR),9,series_thumbnail_320_1,1
|
||||
321,2,1,255,Event Reward (SR) Part 5,Event Reward (SR),9,series_thumbnail_321_1,1
|
||||
322,2,1,268,Event Reward (SR) Part 6,Event Reward (SR),9,series_thumbnail_322_1,1
|
||||
323,2,1,289,Event Reward (SR) Part 7,Event Reward (SR),9,series_thumbnail_323_1,1
|
||||
324,2,1,304,Event Reward (SR) Part 8,Event Reward (SR),9,series_thumbnail_324_1,1
|
||||
325,2,1,320,Event Reward (SR) Part 9,Event Reward (SR),7,series_thumbnail_325_1,1
|
||||
326,2,1,334,Event Reward (SR) Part 10,Event Reward (SR),9,series_thumbnail_326_1,1
|
||||
327,2,1,339,Best Besties Election,Companion Election,2,series_thumbnail_327_1,1
|
||||
328,2,1,222,Come See Aqours ♪<br>The Great Winter Break Plan,The Winter Holidays with Aqours!,1,series_thumbnail_328_1,1
|
||||
329,2,1,237,Gamers Numazu 1st Anniversary,Gamers Numazu 1st Anniversary,1,series_thumbnail_0_1,1
|
||||
330,2,1,261,Gamers Numazu 2nd Anniversary,Gamers Numazu 2nd Anniversary,1,series_thumbnail_0_1,1
|
||||
331,2,1,272,SIF 5th Anniversary<br>Campaign Girl,5th Anniversary Celebration Girls,1,series_thumbnail_331_1,1
|
||||
332,2,1,280,7-Eleven Campaign<br>Poster Girl,7-Eleven,1,series_thumbnail_0_1,1
|
||||
333,2,1,288,Sega Staff Poster Girls,SEGA Staff Costume,1,series_thumbnail_0_1,1
|
||||
334,2,1,312,Special Delivery Part 3,Special Release Part 3,1,series_thumbnail_0_1,1
|
||||
335,2,1,331,Shadowverse Collab<br>Campaign Girl,Shadowverse x SIF<br>Collaboration Event,1,series_thumbnail_335_1,1
|
||||
336,2,1,204,Kimino Kokorowa Kagayaiterukai?<br>(R),Kimino Kokorowa Kagayaiterukai?<br> (R),9,series_thumbnail_336_1,1
|
||||
337,2,1,206,Koini Naritai AQUARIUM (R),Koini Naritai AQUARIUM (R),9,series_thumbnail_337_1,1
|
||||
338,2,1,207,Aozora Jumping Heart (R),Aozora Jumping Heart (R),9,series_thumbnail_338_1,1
|
||||
339,2,1,223,Mijuku DREAMER (R),Mijuku DREAMER (R),9,series_thumbnail_339_1,1
|
||||
340,2,1,241,HAPPY PARTY TRAIN (R),HAPPY PARTY TRAIN (R),9,series_thumbnail_340_1,1
|
||||
341,2,1,246,Omoiyo Hitotsuninare (R),Omoiyo Hitotsuninare (R),9,series_thumbnail_341_1,1
|
||||
342,2,1,258,MIRAI TICKET (R),MIRAI TICKET (R),9,series_thumbnail_342_1,1
|
||||
343,1,99,348,μ's Childhood Memories,μ's<br>Childhood Memory,9,series_thumbnail_343_1,1
|
||||
344,1,99,350,μ's Baby Animals,μ's<br>Tiny Animal,9,series_thumbnail_344_1,1
|
||||
345,1,99,344,A-RISE,A-RISE,3,series_thumbnail_345_1,1
|
||||
346,1,99,346,Support Members<br>(School),Support Member<br>School Staff & Students,17,series_thumbnail_346_1,1
|
||||
347,1,99,347,Support Members<br>(Family),Support Member<br>Family,17,series_thumbnail_347_1,1
|
||||
348,1,99,345,Support Members<br>(Animals),Support Member<br>Animal,5,series_thumbnail_348_1,1
|
||||
349,1,99,349,Love Live! Puchiguru Collab,Puchiguru Love Live! Collaboration,1,series_thumbnail_349_1,1
|
||||
350,1,99,351,Starlight Sailors<br>(SIF AC),Starlight Sailor,1,series_thumbnail_350_1,1
|
||||
351,2,99,356,Aqours Childhood Memories,Aqours<br>Childhood Memory,9,series_thumbnail_351_1,1
|
||||
352,2,99,358,Aqours Baby Animals,Aqours<br>Tiny Animal,9,series_thumbnail_352_1,1
|
||||
353,2,99,352,Saint Snow,Saint Snow,11,series_thumbnail_353_1,1
|
||||
354,2,99,354,Support Members (School),Support Member<br>School Staff & Students,4,series_thumbnail_354_1,1
|
||||
355,2,99,355,Support Members (Family),Support Member<br>Family,4,series_thumbnail_355_1,1
|
||||
356,2,99,353,Support Members (Animals),Support Member<br>Animal,9,series_thumbnail_356_1,1
|
||||
357,2,99,357,Love Live! Puchiguru Collab,Puchiguru Love Live! Collaboration,1,series_thumbnail_357_1,1
|
||||
358,2,99,359,Flower Circles<br>(SIF AC),Floral Flourish,1,series_thumbnail_358_1,1
|
||||
359,3,1,402,TOKIMEKI Runners (SR),TOKIMEKI Runners (SR),9,series_thumbnail_359_1,1
|
||||
360,3,1,404,Nijigasaki High School Idol<br>Club Special Delivery Part 1,Nijigasaki High School Idol Club<br>Special Release,9,series_thumbnail_360_1,1
|
||||
361,3,1,403,SIF 5th Anniversary<br>Campaign Girl,5th Anniversary Celebration Girls,1,series_thumbnail_361_1,1
|
||||
362,3,1,405,Nijigasaki High School Idol<br>Club Special Delivery Part 2,Nijigasaki High School Idol Club<br>Special Release,3,series_thumbnail_362_1,1
|
||||
363,99,99,360,Seiran High School Part 1,Seiran High School,9,series_thumbnail_363_1,1
|
||||
364,99,99,361,Seiran High School Part 2,Seiran High School,9,series_thumbnail_364_1,1
|
||||
365,99,99,362,Seiran High School Part 3,Seiran High School,9,series_thumbnail_365_1,1
|
||||
366,99,99,363,Seiran High School Part 4,Seiran High School,9,series_thumbnail_366_1,1
|
||||
367,99,99,364,Seiran High School Part 5,Seiran High School,9,series_thumbnail_367_1,1
|
||||
368,99,99,365,Seiran High School Part 6,Seiran High School,9,series_thumbnail_0_1,1
|
||||
369,99,99,366,Seiran High School Part 7,Seiran High School,8,series_thumbnail_369_2,1
|
||||
370,99,99,367,Shinonome Academy Part 1,Shinonome Academy,9,series_thumbnail_370_1,1
|
||||
371,99,99,368,Shinonome Academy Part 2,Shinonome Academy,9,series_thumbnail_371_1,1
|
||||
372,99,99,369,Shinonome Academy Part 3,Shinonome Academy,9,series_thumbnail_372_1,1
|
||||
373,99,99,370,Shinonome Academy Part 4,Shinonome Academy,9,series_thumbnail_373_1,1
|
||||
374,99,99,371,Shinonome Academy Part 5,Shinonome Academy,9,series_thumbnail_374_1,1
|
||||
375,99,99,372,Shinonome Academy Part 6,Shinonome Academy,9,series_thumbnail_0_1,1
|
||||
376,99,99,373,Shinonome Academy Part 7,Shinonome Academy,8,series_thumbnail_376_2,1
|
||||
377,99,99,374,Chitose Bridge High School Part 1,Chitosebashi High School,9,series_thumbnail_377_1,1
|
||||
378,99,99,375,Chitose Bridge High School Part 2,Chitosebashi High School,9,series_thumbnail_378_1,1
|
||||
379,99,99,376,Chitose Bridge High School Part 3,Chitosebashi High School,9,series_thumbnail_379_1,1
|
||||
380,99,99,377,Chitose Bridge High School Part 4,Chitosebashi High School,9,series_thumbnail_380_1,1
|
||||
381,99,99,378,Chitose Bridge High School Part 5,Chitosebashi High School,9,series_thumbnail_381_1,1
|
||||
382,99,99,379,Chitose Bridge High School Part 6,Chitosebashi High School,9,series_thumbnail_0_1,1
|
||||
383,99,99,380,Chitose Bridge High School Part 7,Chitosebashi High School,9,series_thumbnail_383_2,1
|
||||
384,99,99,381,Touou Academy Part 1,Touoh School,9,series_thumbnail_384_1,1
|
||||
385,99,99,382,Touou Academy Part 2,Touoh School,9,series_thumbnail_385_1,1
|
||||
386,99,99,383,Touou Academy Part 3,Touoh School,9,series_thumbnail_386_1,1
|
||||
387,99,99,384,Touou Academy Part 4,Touoh School,9,series_thumbnail_387_1,1
|
||||
388,99,99,385,Touou Academy Part 5,Touoh School,9,series_thumbnail_388_1,1
|
||||
389,99,99,386,Touou Academy Part 6,Touoh School,9,series_thumbnail_0_1,1
|
||||
390,99,99,387,Touou Academy Part 7,Touoh School,9,series_thumbnail_390_2,1
|
||||
391,99,99,388,Shion Girls Academy Part 1,Shion Girls Academy,9,series_thumbnail_391_1,1
|
||||
392,99,99,389,Shion Girls Academy Part 2,Shion Girls Academy,9,series_thumbnail_392_1,1
|
||||
393,99,99,390,Shion Girls Academy Part 3,Shion Girls Academy,9,series_thumbnail_393_1,1
|
||||
394,99,99,391,Shion Girls Academy Part 4,Shion Girls Academy,9,series_thumbnail_394_1,1
|
||||
395,99,99,392,Shion Girls Academy Part 5,Shion Girls Academy,9,series_thumbnail_395_1,1
|
||||
396,99,99,393,Shion Girls Academy Part 6,Shion Girls Academy,9,series_thumbnail_0_1,1
|
||||
397,99,99,394,Shion Girls Academy Part 7,Shion Girls Academy,9,series_thumbnail_397_2,1
|
||||
398,99,99,395,Y.G. International Academy Part 1,Y. G. International School,9,series_thumbnail_398_1,1
|
||||
399,99,99,396,Y.G. International Academy Part 2,Y. G. International School,9,series_thumbnail_399_1,1
|
||||
400,99,99,397,Y.G. International Academy Part 3,Y. G. International School,9,series_thumbnail_400_1,1
|
||||
401,99,99,398,Y.G. International Academy Part 4,Y. G. International School,9,series_thumbnail_401_1,1
|
||||
402,99,99,399,Y.G. International Academy Part 5,Y. G. International School,9,series_thumbnail_402_1,1
|
||||
403,99,99,400,Y.G. International Academy Part 6,Y. G. International School,9,series_thumbnail_0_1,1
|
||||
404,99,99,401,Y.G. International Academy Part 7,Y. G. International School,8,series_thumbnail_404_2,1
|
||||
405,99,99,406,SIF All Stars 60 Day Login Members,All Stars 60-Day Member,2,series_thumbnail_0_1,1
|
||||
406,1,1,407,Together in Our Dreams,Together in Our Dreams,1,series_thumbnail_406_1,1
|
||||
407,2,1,326,Chinese Server Originals,Special UR Release,2,series_thumbnail_407_1,1
|
||||
408,1,1,408,Chinese Server Originals,Special UR Release,2,series_thumbnail_408_1,1
|
||||
409,2,1,409,Spring Fairies Part 1,Springtime Fairy (1/2),15,series_thumbnail_409_1,1
|
||||
410,2,1,410,Spring Fairies Part 2,Springtime Fairy (2/2),14,series_thumbnail_410_1,1
|
||||
411,1,1,411,Event Reward (SR) Part 19,Event Reward (SR),2,series_thumbnail_411_1,1
|
||||
412,1,1,412,Make-Up Magic Part 2,Makeup's Magic (2/2),14,series_thumbnail_412_1,1
|
||||
413,2,1,413,Event Reward (SR) Part 11,Event Reward (SR),2,series_thumbnail_413_1,1
|
||||
414,2,1,414,Mirai no Bokura wa Shitteru yo (UR),Mirai no Bokura wa Shitteru yo<br>(UR),9,series_thumbnail_414_2,1
|
||||
415,2,1,415,Special Delivery Part 4,Special Release Part 4,1,series_thumbnail_0_1,1
|
||||
416,1,1,416,Powerpuff Girls Collab,The Powerpuff Girls Collab,9,series_thumbnail_416_1,1
|
||||
417,2,1,417,Powerpuff Girls Collab,The Powerpuff Girls Collab,9,series_thumbnail_417_1,1
|
||||
419,1,1,419,Amusement Park Part 1,Amusement Park (1/2),7,series_thumbnail_419_1,1
|
||||
420,1,1,420,Bokura wa Ima no Naka de (UR),Bokura wa Ima no Naka de(UR),9,series_thumbnail_420_2,1
|
||||
421,2,1,421,Birthday Surprise!,Birthday Surprise,9,series_thumbnail_421_9,1
|
||||
422,2,1,422,SIF Thanksgiving 2019,Fan Festival 2019,9,series_thumbnail_422_9,1
|
||||
423,1,99,423,SR Special Costumes μ's,μ's<br>Special SR Costume,1,series_thumbnail_423_1,1
|
||||
424,2,99,424,SR Special Costumes Aqours,Aqours<br>Special SR Costume,1,series_thumbnail_424_1,1
|
||||
425,2,1,425,Flower Wreaths Part 1,Flower Crown (1/2),7,series_thumbnail_425_1,1
|
||||
426,1,1,426,Amusement Park Part 2,Amusement Park (2/2),2,series_thumbnail_426_1,1
|
||||
427,1,1,427,Teru Teru Bozu Dolls Part 1,Teru Teru Bozu (1/2),7,series_thumbnail_427_1,1
|
||||
428,2,1,428,Flower Wreaths Part 2,Flower Crown (2/2),2,series_thumbnail_428_1,1
|
||||
429,2,1,429,Rainy Day Part 1,Rainy Day (1/2),7,series_thumbnail_429_1,1
|
||||
430,1,1,430,Teru Teru Bozu Dolls Part 2,Teru Teru Bozu (2/2),2,series_thumbnail_430_1,1
|
||||
431,1,1,431,Star Festival Part 1,Star Festival (1/2),7,series_thumbnail_431_1,1
|
||||
432,2,1,432,Rainy Day Part 2,Rainy Day(2/2),2,series_thumbnail_432_1,1
|
||||
433,2,1,433,Chapel Part 1,Chapel (1/2),7,series_thumbnail_433_1,1
|
||||
434,1,1,434,Star Festival Part 2,Star Festival (2/2),2,series_thumbnail_434_1,1
|
||||
435,2,1,435,AZALEA<br>Amazing Travel DNA,AZALEA<br>Amazing Travel DNA,3,series_thumbnail_435_1,1
|
||||
436,1,1,436,Unit Live Shows,Unit Live Show,9,series_thumbnail_436_2,1
|
||||
437,1,1,437,Challengers,Challenges,9,series_thumbnail_437_9,1
|
||||
438,2,1,438,CYaRon!<br>Braveheart Coaster,CYaRon!<br>Braveheart Coaster,3,series_thumbnail_438_1,1
|
||||
439,2,1,439,Chapel Part 2,Chapel (2/2),2,series_thumbnail_439_1,1
|
||||
440,2,1,440,Unit vs. Unit,Unit Battle,9,series_thumbnail_440_2,1
|
||||
441,2,1,441,Heading to Tokyo,Tokyo Visit,9,series_thumbnail_441_9,1
|
||||
442,2,1,442,Guilty Kiss<br>New Romantic Sailors,Guilty Kiss<br>New Romantic Sailors,3,series_thumbnail_442_1,1
|
||||
443,1,1,443,Sandy Beach,On the Shore,2,series_thumbnail_443_1,1
|
||||
444,2,1,444,Kimino Kokorowa Kagayaiterukai?<br>(UR),Kimino Kokorowa Kagayaiterukai?<br>(UR),9,series_thumbnail_444_2,1
|
||||
445,2,1,445,Fireworks,Summer Fireworks,2,series_thumbnail_445_1,1
|
||||
446,1,1,446,Bar-B-Q,Barbecue,2,series_thumbnail_446_1,1
|
||||
447,2,1,447,Sea Swimming,Beach Day,2,series_thumbnail_447_1,1
|
||||
448,1,1,448,Halloween Party,Halloween Party,2,series_thumbnail_448_1,1
|
||||
449,1,1,450,Cheerleaders,Cheerleader,9,series_thumbnail_449_2,1
|
||||
450,2,1,451,Halloween Outing,Halloween Outing,2,series_thumbnail_450_1,1
|
||||
451,2,1,452,Uniforms,Uniform,9,series_thumbnail_451_2,1
|
||||
452,3,1,449,Nijigasaki Anime Special Delivery,TV Anime Nijigaku Special Broadcast,9,series_thumbnail_452_1,1
|
||||
453,1,1,453,Fall Leaves,Vivid Foliage,2,series_thumbnail_453_1,1
|
||||
454,2,1,454,2020 Costume Contest<br>Sweets of the World,Sweets of the World,9,series_thumbnail_454_2,1
|
||||
455,1,1,456,2020 Costume Contest<br>Sweets of the World,Sweets of the World,9,series_thumbnail_455_2,1
|
||||
456,2,1,455,Taking a Walk,Taking a Stroll,2,series_thumbnail_456_1,1
|
||||
457,1,99,457,Support Members (Family) Part 2,Support Member<br>Family 2,1,series_thumbnail_457_1,1
|
||||
458,2,99,458,Support Members (Family) Part 2,Support Member<br>Family 2,1,series_thumbnail_458_1,1
|
||||
459,3,99,459,Support Members (Family),Support Member<br>Family,1,series_thumbnail_459_1,1
|
||||
460,3,1,460,SIF Series Thanksgiving<br>2020 Costumes,Fan Festival 2020,9,series_thumbnail_460_2,1
|
||||
461,3,99,461,Support Members (School),Support Member<br>School Staff & Students 1,1,series_thumbnail_461_1,1
|
||||
462,1,1,462,Christmas Costumes,Christmas Costume,2,series_thumbnail_462_1,1
|
||||
463,2,1,463,Christmas Musical,Christmas Musical,2,series_thumbnail_463_1,1
|
||||
464,1,1,464,Ninestar Venus<br>(SIF AC),Nine Star Venus,9,series_thumbnail_464_2,1
|
||||
465,2,1,465,Ninewave Dolphin<br>(SIF AC),Nine Wave Dolphin,9,series_thumbnail_465_2,1
|
||||
466,1,1,466,First Shrine Visit,The New Year Visit,2,series_thumbnail_466_1,1
|
||||
467,1,1,467,Hot-Pot Party,Hot Pot Party,9,series_thumbnail_467_2,1
|
||||
468,1,1,468,Fairy Tale<br>Princesses Costumes,Fairy Tale Princess,9,series_thumbnail_468_9,1
|
||||
469,2,1,469,Kimono Fitting,Kimono Wearing,2,series_thumbnail_469_1,1
|
||||
470,1,1,470,SIF Series Thanksgiving<br>2020 Costumes,Fan Festival 2020,9,series_thumbnail_470_9,1
|
||||
471,2,1,471,Food Stand,Food Stand,9,series_thumbnail_471_2,1
|
||||
472,1,1,472,Valentine's Live Show,Valentine's Live Show,2,series_thumbnail_472_1,1
|
||||
473,2,1,473,Awaken the power (UR),Awaken the power(UR),9,series_thumbnail_473_2,1
|
||||
474,2,1,474,Setsubun,Setsubun Festival,2,series_thumbnail_474_1,1
|
||||
475,1,1,475,Spring Tea Party,Spring Tea Party,2,series_thumbnail_475_1,1
|
||||
476,2,1,476,Springtime Sailing,Spring Boat Party,2,series_thumbnail_476_1,1
|
||||
477,1,1,477,It's our miraculous time (UR),It's our miraculous time(UR),9,series_thumbnail_477_2,1
|
||||
478,1,1,478,Strawberry Picking,Strawberry Picking,2,series_thumbnail_478_1,1
|
||||
479,1,1,479,Crayon Shin-chan Collab,Crayon Shinchan Collab,9,series_thumbnail_479_1,1
|
||||
480,2,1,480,Crayon Shin-chan Collab,Crayon Shinchan Collab,9,series_thumbnail_480_1,1
|
||||
484,1,1,484,Flower Festival,Flower Festival,9,series_thumbnail_484_2,1
|
||||
485,1,1,485,Try Again,Once More with Feeling,9,series_thumbnail_485_9,1
|
||||
486,2,1,486,Aozora Jumping Heart (UR),Aozora Jumping Heart(UR),9,series_thumbnail_486_2,1
|
||||
487,2,1,487,Fairy Tale<br>Princesses Costumes,Fairy Tale Princess,9,series_thumbnail_487_9,1
|
||||
488,2,1,489,SIF Series Thanksgiving<br>2020 Costumes,Fan Festival 2020,9,series_thumbnail_488_9,1
|
||||
489,2,1,488,Retro Coffee Shop,Retro Cafe,2,series_thumbnail_489_1,1
|
||||
490,2,1,498,Little Chicks,Chick,9,series_thumbnail_490_2,1
|
||||
491,2,1,499,Shopping Mall Live Show,Shopping Arcade Live Show,9,series_thumbnail_491_9,1
|
||||
492,3,1,490,Summer Casual,Nijigasaki Summer Casual,9,series_thumbnail_492_2,1
|
||||
493,3,1,491,Summer Uniforms,Nijigasaki Uniform,9,series_thumbnail_493_2,1
|
||||
494,3,1,492,Summer Practice Clothes,Nijigasaki Practice Wear,9,series_thumbnail_494_2,1
|
||||
495,3,1,493,Winter Casual,Nijigasaki Winter Casual,9,series_thumbnail_495_2,1
|
||||
496,3,1,494,Winter Practice Clothes,Nijigasaki Practice Wear,9,series_thumbnail_496_2,1
|
||||
497,3,1,495,Swimsuits,Nijigasaki Swim Suit,9,series_thumbnail_497_2,1
|
||||
498,3,1,496,Solo Stage Costumes (SR),Nijigasaki Solo Costume (SR),9,series_thumbnail_498_2,1
|
||||
499,3,1,497,Love U my Friends (UR),Love U my friends(UR),9,series_thumbnail_499_2,1
|
||||
500,1,1,500,Sleepover,Slumber Meeting,2,series_thumbnail_500_1,1
|
||||
501,2,1,501,Carp Streamers,Carp Streamers,2,series_thumbnail_501_1,1
|
||||
502,3,1,502,Birthday Live Show,Birthday Live Show,9,series_thumbnail_502_8,1
|
||||
503,3,1,503,SIF Thanksgiving 2019,Fan Festival 2019,9,series_thumbnail_503_8,1
|
||||
504,1,1,504,Aquarium,Aquarium,2,series_thumbnail_504_1,1
|
||||
505,2,1,505,After the Rain,After the Rain,2,series_thumbnail_505_1,1
|
||||
506,1,1,506,Summertime Sea,Summer Sea,2,series_thumbnail_506_1,1
|
||||
507,2,1,507,Fantastic Departure! (UR),Fantastic Departure!(UR),9,series_thumbnail_507_2,1
|
||||
508,1,1,508,Summer Skies,Summer Sky,9,series_thumbnail_508_2,1
|
||||
509,4,1,509,Love Live! Superstar!!<br>Special Delivery Part 1,Love Live! Superstar!!<br>Special Release Part 1,5,series_thumbnail_509_2,1
|
||||
510,2,1,510,Morning Glory,Morning Glories,2,series_thumbnail_510_1,1
|
||||
511,2,1,511,Stargazing,Stargazing,9,series_thumbnail_511_2,1
|
||||
512,99,99,512,Transfer Student Election 4,Transfer Student Popularity<br>Contest Round 4,9,series_thumbnail_512_1,1
|
||||
513,1,1,513,Shaved Ice,Shaved Ice,2,series_thumbnail_513_1,1
|
||||
514,3,1,515,Nijigasaki 3rd Solo Song Costumes,Nijigasaki 3rd Solo Song<br>Costume,9,series_thumbnail_514_2,1
|
||||
515,3,1,516,Nijigasaki 3rd Solo Song Costumes 2,Nijigasaki 3rd Solo Song<br>Costume 2,1,series_thumbnail_515_1,1
|
||||
516,2,1,519,smile smile ship Start! (UR),smile smile ship Start! (UR),9,series_thumbnail_516_2,1
|
||||
517,2,1,518,Pool Athletics,Athletic Pool,2,series_thumbnail_517_1,1
|
||||
518,4,1,520,Casual Clothes,Casual Clothes,5,series_thumbnail_0_1,1
|
||||
519,4,1,521,Uniforms,School Uniform,5,series_thumbnail_0_1,1
|
||||
520,4,1,522,Hajimari wa Kimi no Sora (SR),Hajimari wa Kimi no Sora (SR),5,series_thumbnail_0_1,1
|
||||
521,4,1,523,Hajimari wa Kimi no Sora (SR) 2,Hajimari wa Kimi no Sora (SR) 2,5,series_thumbnail_0_1,1
|
||||
522,4,1,524,1 Panel Comics,Everyday Life,5,series_thumbnail_0_1,1
|
||||
523,4,1,525,Hajimari wa Kimi no Sora (UR),Hajimari wa Kimi no Sora Costume<br>(UR),5,series_thumbnail_523_2,1
|
||||
524,2,1,517,Special Delivery Part 5,Special Release Part 5,9,series_thumbnail_524_1,1
|
||||
525,3,1,514,Love Live! Series 9th Anniversary<br>Sega Collab,Love Live! Series<br>9th Anniversary SEGA Collab,9,series_thumbnail_525_1,1
|
||||
526,1,1,526,Stargazing Dumplings,Stargazing Dumplings,2,series_thumbnail_526_1,1
|
||||
527,2,1,527,Special Delivery Part 6,Special Release Part 6,9,series_thumbnail_527_1,1
|
||||
528,2,1,530,Special Delivery Part 7,Special Release,9,series_thumbnail_528_1,1
|
||||
529,2,1,529,Making Pancakes,Pancakes,2,series_thumbnail_529_1,1
|
||||
530,3,1,538,Birthday Live Show 2,Birthday Live Show 2,3,series_thumbnail_530_3,1
|
||||
531,1,1,539,Halloween Cooking,Halloween Cooking,2,series_thumbnail_531_1,1
|
||||
532,2,1,528,MIRACLE WAVE (Wardrobe Change Only),MIRACLE WAVE<br>(Makeover Costume),9,series_thumbnail_532_1,1
|
||||
533,3,1,540,Birthday Celebration Prologue,Birthday Prologue Costume,3,series_thumbnail_533_3,1
|
||||
534,1,1,541,Electric World,Electric World,9,series_thumbnail_534_2,1
|
||||
535,2,1,542,Mijuku DREAMER (Wardrobe Change Only),Mijuku DREAMER<br>(Makeover Costume),9,series_thumbnail_535_1,1
|
||||
536,3,1,531,Summer Casual 2,Nijigasaki Summer Casual 2,3,series_thumbnail_536_3,1
|
||||
537,3,1,532,Summer Uniforms 2,Nijigasaki Uniform 2,3,series_thumbnail_537_3,1
|
||||
538,3,1,533,Summer Practice Clothes 2,Nijigasaki Practice Wear 2,3,series_thumbnail_538_3,1
|
||||
539,3,1,534,Winter Casual 2,Nijigasaki Winter Casual 2,3,series_thumbnail_539_3,1
|
||||
540,3,1,535,Winter Practice Clothes 2,Nijigasaki Practice Wear 2,3,series_thumbnail_540_3,1
|
||||
541,3,1,536,Swimsuits 2,Nijigasaki Swim Suit 2,3,series_thumbnail_541_1,1
|
||||
542,3,1,537,Solo Stage Costumes (SR) 2,Nijigasaki Solo Costume (SR) 2,3,series_thumbnail_542_3,1
|
||||
543,2,1,543,Halloween Shopping,Halloween Shopping,2,series_thumbnail_543_1,1
|
||||
544,2,1,545,Rainy Season Ensemble,Rainy Season Outfit,9,series_thumbnail_544_1,1
|
||||
545,3,1,546,Nijigasaki Tracksuits,Nijigasaki PE Jacket,9,series_thumbnail_545_1,1
|
||||
546,3,1,547,Nijigasaki Tracksuits 2,Nijigasaki PE Jacket 2,1,series_thumbnail_546_1,1
|
||||
547,2,1,544,Toyland,Toy World,9,series_thumbnail_547_1,1
|
||||
548,1,1,549,Autumn Park,Park in Fall,2,series_thumbnail_548_1,1
|
||||
549,1,1,550,Persona Series Collab,Persona Series Collab,9,series_thumbnail_549_1,1
|
||||
550,1,1,551,Persona Series Collab<br>Campaign Girl,Persona Series Collab<br>Campaign Girl,1,series_thumbnail_550_1,1
|
||||
551,2,1,552,Persona Series Collab,Persona Series Collab,9,series_thumbnail_551_1,1
|
||||
553,3,1,548,Love U my Friends (UR) 2,Love U my friends (UR) 2,1,series_thumbnail_553_1,1
|
||||
555,4,1,555,Fresh Live,Fresh Live Show,5,series_thumbnail_555_1,1
|
||||
556,2,1,556,Petting Zoo,Petting Zoo,2,series_thumbnail_556_1,1
|
||||
557,2,1,557,MIRAI TICKET (UR),MIRAI TICKET (UR),9,series_thumbnail_557_1,1
|
||||
558,1,1,558,Illuminations,Illumination,2,series_thumbnail_558_1,1
|
||||
559,4,1,559,Colorful Performances,Colorful Performance,5,series_thumbnail_559_1,1
|
||||
560,2,1,560,White Christmas,White Christmas,2,series_thumbnail_560_1,1
|
||||
561,1,1,561,Made in Wonderland<br>(SIF AC),Maid in Wonderland<br>(SIF AC),9,series_thumbnail_561_1,1
|
||||
562,2,1,562,Made in Legends<br>(SIF AC),Maid in Residence<br>(SIF AC),9,series_thumbnail_562_1,1
|
||||
563,1,1,563,New Year's,New Year's,2,series_thumbnail_563_1,1
|
||||
564,1,1,564,Icy Dreamworld,Ice Illusion,9,series_thumbnail_564_1,1
|
||||
565,1,1,565,Composing Music,Song Making,9,series_thumbnail_565_2,1
|
||||
566,1,1,566,Brilliant Jewelry,Brilliant Jewelry,9,series_thumbnail_566_1,1
|
||||
567,4,1,567,Powerful Event,Powerful Paint,5,series_thumbnail_567_1,1
|
||||
568,2,1,574,Lottery Drawing,Omikuji,2,series_thumbnail_568_1,1
|
||||
569,2,1,579,Fancy Fashion,Fancy,9,series_thumbnail_569_1,1
|
||||
570,2,1,580,Songwriting,Song Making,9,series_thumbnail_570_2,1
|
||||
571,1,1,571,Countdown Live Show,Countdown Live Show,9,series_thumbnail_571_1,1
|
||||
572,2,1,568,New Year's Live Show,New Year's Live Show,9,series_thumbnail_572_1,1
|
||||
573,3,1,573,Fleurs Modernes,Modern Fleur,9,series_thumbnail_573_1,1
|
||||
574,2,1,572,DREAMY COLOR (SSR),DREAMY COLOR (SSR),9,series_thumbnail_574_1,1
|
||||
575,3,1,575,L!L!L! (SSR),L!L!L! (SSR),9,series_thumbnail_575_1,1
|
||||
576,3,1,576,L!L!L! (SSR) 2,L!L!L! (SSR) 2,3,series_thumbnail_576_1,1
|
||||
577,4,1,577,START!! True dreams (SSR),START!! True dreams (SSR),5,series_thumbnail_577_1,1
|
||||
578,1,1,578,SIF Series Thanksgiving<br>2021 Costumes,Fan Festival 2021,9,series_thumbnail_578_1,1
|
||||
579,1,1,581,Snow Festival,Snow Festival,2,series_thumbnail_579_1,1
|
||||
580,4,1,582,Purely Dresses,Purely Dress,5,series_thumbnail_580_1,1
|
||||
581,2,1,583,World Cat Day,World Cat Day,2,series_thumbnail_581_1,1
|
||||
584,1,1,586,In the Audience,Live Show Cheering,2,series_thumbnail_584_1,1
|
||||
585,4,1,587,Retro Pop,Retro Pop,5,series_thumbnail_585_1,1
|
||||
587,2,1,585,Gamers Numazu 5th Anniversary,Gamers Numazu 5th Anniversary,9,series_thumbnail_587_1,1
|
||||
588,2,1,588,KU-RU-KU-RU Cruller! (UR),KU-RU-KU-RU Cruller!(UR),9,series_thumbnail_588_1,1
|
||||
589,2,1,589,European Town,European Town,2,series_thumbnail_589_1,1
|
||||
590,4,99,590,Sunny Passion,Sunny Passion,2,series_thumbnail_590_1,1
|
||||
598,1,1,603,Candy Pop Princesses,Candy Pop Princess,9,series_thumbnail_598_1,1
|
||||
599,2,1,605,Code Geass Collab,Code Geass Collab,9,series_thumbnail_599_1,1
|
||||
600,2,1,606,Code Geass Collab<br>Campaign Girl,Code Geass Collab<br>Campaign Girl,1,series_thumbnail_600_1,1
|
||||
601,1,1,607,Code Geass Collab,Code Geass Collab,9,series_thumbnail_601_1,1
|
||||
603,4,99,591,Support Members (School),Support Member<br>School Staff & Students,4,series_thumbnail_603_1,1
|
||||
604,4,99,592,Support Members (Family),Support Member<br>Family,3,series_thumbnail_604_1,1
|
||||
605,4,99,593,Support Members (Animals),Support Member<br>Animal,3,series_thumbnail_0_1,1
|
||||
606,2,1,594,Ocean Particles,Ocean Particle,9,series_thumbnail_606_1,1
|
||||
607,2,1,595,Special Delivery Part 8,Special Release Part 8,9,series_thumbnail_607_1,1
|
||||
609,2,1,611,Brilliant Jewelry,Brilliant Jewelry,9,series_thumbnail_609_8,1
|
||||
610,1,1,618,Take Me All Around the World♡,Show Me the World,9,series_thumbnail_610_1,1
|
||||
611,2,1,619,Take Me All Around the World♡,Show Me the World,9,series_thumbnail_611_1,1
|
||||
612,2,1,617,Love Live! Series 9th Anniversary<br>Sega Collab,Love Live! Series<br>9th Anniversary SEGA Collab,9,series_thumbnail_612_2,1
|
||||
613,1,1,609,Love Live! Series 9th Anniversary<br>Sega Collab,Love Live! Series<br>9th Anniversary SEGA Collab,9,series_thumbnail_613_2,1
|
||||
614,4,1,610,Cherry Blossoms,Cherry Blossom,5,series_thumbnail_614_1,1
|
||||
615,1,1,612,Bokutachi wa Hitotsu no Hikari (UR) Part 2,Bokutachi wa Hitotsu no Hikari (UR)Part 2,9,series_thumbnail_615_1,1
|
||||
616,2,1,613,Next SPARKLING!! (UR),Next SPARKLING!! (UR),9,series_thumbnail_616_1,1
|
||||
617,3,1,614,TOKIMEKI Runners (UR),TOKIMEKI Runners (UR),9,series_thumbnail_617_1,1
|
||||
618,4,1,615,Starlight Prologue (UR),Starlight Prologue (UR),5,series_thumbnail_618_1,1
|
||||
619,2,1,616,SIF Series Thanksgiving<br>2021 Costumes,Fan Festival 2021,9,series_thumbnail_619_9,1
|
||||
620,3,1,621,Odaiba Gamers T-Shirt,ODAIBA Gamers T Shirt Costume,6,series_thumbnail_620_1,1
|
||||
621,3,1,622,Odaiba Gamers T-Shirt 2,ODAIBA Gamers T Shirt Costume 2,6,series_thumbnail_621_1,1
|
||||
622,4,1,620,START!! True dreams (UR),START!! True dreams (UR),5,series_thumbnail_622_1,1
|
||||
623,4,1,623,Boys' Day,Children's Day,5,series_thumbnail_623_1,1
|
||||
624,1,1,624,SIF 9th Anniversary<br>Festival Costumes,SIF 9th Anniversary<br> (Festival) costume,1,series_thumbnail_624_1,1
|
||||
625,2,1,625,SIF 9th Anniversary<br>Festival Costumes,SIF 9th Anniversary<br> (Festival) costume,1,series_thumbnail_625_1,1
|
||||
626,3,1,626,SIF 9th Anniversary<br>Festival Costumes,SIF 9th Anniversary<br> (Festival) costume,1,series_thumbnail_626_1,1
|
||||
627,4,1,627,SIF 9th Anniversary<br>Festival Costumes,SIF 9th Anniversary<br> (Festival) costume,1,series_thumbnail_627_1,1
|
||||
628,2,1,628,Escape Game Collab Round 3,Real-Life Room Escape<br>Collaboration Part 3,9,series_thumbnail_628_1,1
|
||||
629,2,1,629,Flower Circles,Flower Circle,9,series_thumbnail_629_2,1
|
||||
630,3,1,631,SIF Series Thanksgiving<br>2021 Costumes,Fan Festival 2021,6,series_thumbnail_630_6,1
|
||||
631,3,1,630,Brilliant Jewelry,Brilliant Jewelry,6,series_thumbnail_631_5,1
|
||||
632,1,1,632,Blazers and Hats,Blazers and Hats,9,series_thumbnail_632_2,1
|
||||
633,4,1,633,June Bride,June Bride,5,series_thumbnail_633_1,1
|
||||
634,2,1,634,Demonstration,Demonstration,1,series_thumbnail_634_1,1
|
||||
635,2,1,635,Best Princess in the World,The World's Best Princess,9,series_thumbnail_635_2,1
|
||||
636,2,1,636,Shell Gathering,Clam Digging,2,series_thumbnail_636_1,1
|
||||
637,3,1,637,All-Stars Prologue Costumes,All Stars Prologue,9,series_thumbnail_637_9,1
|
||||
638,2,1,638,Nando datte YAKUSOKU! (UR),Nando datte YAKUSOKU! (UR),9,series_thumbnail_638_1,1
|
||||
639,1,1,639,Best Princess in the World,The World's Best Princess,9,series_thumbnail_639_2,1
|
||||
640,1,1,640,Royal Princesses,Royal Princess,9,series_thumbnail_640_3,1
|
||||
641,4,1,641,Sunny Ocean,Sunny Ocean,5,series_thumbnail_641_1,1
|
||||
642,4,1,642,Winter Uniform,Winter Uniform,4,series_thumbnail_642_2,1
|
||||
643,1,1,643,Endless Summer,Endless Summer,9,series_thumbnail_643_6,1
|
||||
644,2,1,644,Private Beach,Secret Beach,9,series_thumbnail_644_6,1
|
||||
645,2,1,645,Aqours 3rd Solo Song Costumes,Aqours 3rd Solo Song<br>Costume,9,series_thumbnail_645_2,1
|
||||
646,3,1,646,Brilliant Jewelry Part 2,Brilliant Jewelry 2,6,series_thumbnail_646_6,1
|
||||
647,1,1,647,Wind Chimes,Wind Chimes,2,series_thumbnail_647_1,1
|
||||
648,1,1,648,Visiting the Land of the Gods,Visiting the Sacred Grounds,9,series_thumbnail_648_2,1
|
||||
649,2,1,649,Italian Gourmet,Gourmet Italian,9,series_thumbnail_649_2,1
|
||||
650,2,1,650,Luxury Cruise,Luxurious Cruise,9,series_thumbnail_650_3,1
|
||||
651,3,1,651,SIF Series Thanksgiving<br>2021 Costumes Part 2,Fan Festival 2021 2,6,series_thumbnail_651_6,1
|
||||
652,1,1,652,Sterling Racing Girls,Star Racing Girl,9,series_thumbnail_652_2,1
|
||||
653,2,1,653,Essence of Water,Water Essence,9,series_thumbnail_653_2,1
|
||||
654,2,1,654,Summer Skies and Ice Cream,Summer Ice Pops,2,series_thumbnail_654_1,1
|
||||
655,2,1,655,Fall Leaf Hunters on the Seibu Railway,Fall Leaves - Seibu Railway,9,series_thumbnail_655_2,1
|
||||
656,1,1,656,Birthday Date,Birthday Date,9,series_thumbnail_656_2,1
|
||||
657,4,1,657,2022 Costume Contest Little Devils,2022 Costume Contest Little Devil,9,series_thumbnail_657_4,1
|
||||
658,1,1,658,End of Summer,End of the Summer,2,series_thumbnail_658_1,1
|
||||
659,2,1,659,AZALEA<br>GALAXY HidE and SeeK,AZALEA GALAXY HidE and SeeK,3,series_thumbnail_659_2,1
|
||||
660,2,1,660,CYaRon!<br>Kinmirai Happy End,CYaRon! Kinmirai Happy End,3,series_thumbnail_660_2,1
|
||||
661,2,1,661,Guilty Kiss<br>KOWAREYASUKI,Guilty Kiss KOWAREYASUKI,3,series_thumbnail_661_2,1
|
||||
662,1,1,662,Punky Rock Gals,Punkish Rock Girl,9,series_thumbnail_662_2,1
|
||||
663,2,1,663,Funktion Rock,Function Rock,9,series_thumbnail_663_2,1
|
||||
664,2,1,664,Azul Claro Numazu Collab Uniform,Azul Claro Numazu Collab Uniform,9,series_thumbnail_664_1,1
|
||||
665,3,1,665,Chara Pop Festival,Chara Pop Fes,6,series_thumbnail_665_1,1
|
||||
666,3,1,666,Chara Pop Festival 2,Chara Pop Fes 2,6,series_thumbnail_666_1,1
|
||||
667,2,1,667,Umbrella Sky,Umbrella Sky,2,series_thumbnail_667_1,1
|
||||
668,2,1,668,Shine Bright,Shine Bride,9,series_thumbnail_668_2,1
|
||||
669,1,1,671,Cat Pigtails,Twin Tailed Cat,9,series_thumbnail_669_2,1
|
||||
670,2,1,669,Special Delivery Part 9,Special Release Part 9,3,series_thumbnail_670_1,1
|
||||
671,3,1,670,Nijigasaki High School<br>Idol Club Special Delivery Part 3,Nijigasaki High School Idol Club<br>Special Release 3,3,series_thumbnail_671_1,1
|
||||
672,1,1,672,[Party]Classical Japanese,[Party Card] Taisho Roman,2,series_thumbnail_672_1,1
|
||||
673,1,1,673,[Party]June (Dresses),[Party Card] Party Dress,2,series_thumbnail_673_1,1
|
||||
674,1,1,674,[Party]Work Study,[Party Card] Vocational,2,series_thumbnail_674_1,1
|
||||
675,1,1,675,[Party]Circus,[Party Card] Circus,2,series_thumbnail_675_1,1
|
||||
676,1,1,676,[Party]Dancers,[Party Card] Dancer,2,series_thumbnail_676_1,1
|
||||
677,1,1,677,[Party]July (Mermaids),[Party Card] Summer Casual,2,series_thumbnail_677_1,1
|
||||
678,1,1,678,[Party]Tea Party,[Party Card] Tea Party,2,series_thumbnail_678_1,1
|
||||
679,1,1,679,[Party]March (Flowers),[Party Card] Blooming,2,series_thumbnail_679_1,1
|
||||
680,1,1,680,[Party]Little Devils,[Party Card] Little Devil,2,series_thumbnail_680_1,1
|
||||
681,2,1,681,[Party]Cat Café,[Party Card] Cat Cafe,2,series_thumbnail_681_1,1
|
||||
682,2,1,682,[Party]Angels,[Party Card] Angel,2,series_thumbnail_682_1,1
|
||||
683,2,1,683,[Party]Halloween Night,[Party Card] Halloween Festival,2,series_thumbnail_683_1,1
|
||||
684,2,1,684,[Party]Jobs,[Party Card] Vocational,2,series_thumbnail_684_1,1
|
||||
685,2,1,685,[Party]Wonderland,[Party Card] A Curious Place,2,series_thumbnail_685_1,1
|
||||
686,2,1,686,[Party]Halloween,[Party Card] Trick or Treat,2,series_thumbnail_686_1,1
|
||||
687,2,1,687,[Party]Mermaids,[Party Card] Mermaid,2,series_thumbnail_687_1,1
|
||||
688,2,1,688,[Party]Valentine's,[Party Card] Valentine's,2,series_thumbnail_688_1,1
|
||||
689,2,1,689,[Party]Musicians of Bremen,[Party Card] Town Musicians of Bremen,2,series_thumbnail_689_1,1
|
||||
690,2,1,690,Hakodate Christmas,Christmas in Hakodate,9,series_thumbnail_690_2,1
|
||||
691,1,1,691,Flower Garden,Flowery Garden,2,series_thumbnail_691_1,1
|
||||
692,1,1,692,μ's Day Off,A Day Off - μ's,9,series_thumbnail_692_2,1
|
||||
693,2,1,693,Book Café,Book Cafe,2,series_thumbnail_693_1,1
|
||||
694,1,1,694,Kanda Shrine First Visit of the Year,New Year at Kanda Shrine,9,series_thumbnail_694_1,1
|
||||
695,2,1,695,Aqours' Day Off,A Day Off - Aqours,9,series_thumbnail_695_1,1
|
||||
696,1,1,696,Water-Light Dreamland,Dream World of Water and Light,9,series_thumbnail_696_1,1
|
||||
697,1,1,697,Love Live! Festival,Love Live! Fest,9,series_thumbnail_698_2,1
|
||||
698,2,1,698,Love Live! Festival,Love Live! Fest,9,series_thumbnail_699_2,1
|
||||
699,1,1,699,Swimsuit-style Costumes,Swimsuit Costume,9,series_thumbnail_699_1,1
|
||||
700,1,1,703,Nighttime Cherry Blossoms,Night Blossom,2,series_thumbnail_700_1,1
|
||||
701,1,1,700,SUNNY DAY SONG,SUNNY DAY SONG,9,series_thumbnail_701_1,1
|
||||
702,2,1,701,MITAIKEN HORIZON,MITAIKEN HORIZON,9,series_thumbnail_702_1,1
|
||||
703,4,1,702,Yuijo Festival,Yuijosai,9,series_thumbnail_703_1,1
|
||||
704,1,1,704,SIF Series Thanksgiving<br>2020 -ONLINE-,Fan Festival 2020<br>〜ONLINE〜,9,series_thumbnail_704_2,1
|
||||
705,2,1,705,Water-Light Dreamland,Dream World of Ice and Light,9,series_thumbnail_705_1,1
|
||||
|
583
src/router/databases/csv-en/album_series_thumbnail_asset_m.csv
Normal file
583
src/router/databases/csv-en/album_series_thumbnail_asset_m.csv
Normal file
@@ -0,0 +1,583 @@
|
||||
_albumSeriesId,_thumbnailAsset,_thumbnailAssetEn,_masterReleaseLabelId
|
||||
1,series_thumbnail_1_1,0,1
|
||||
2,series_thumbnail_2_1,0,1
|
||||
3,series_thumbnail_3_1,0,1
|
||||
4,series_thumbnail_4_1,0,1
|
||||
5,series_thumbnail_5_1,0,1
|
||||
6,series_thumbnail_6_1,0,1
|
||||
7,series_thumbnail_7_1,0,1
|
||||
8,series_thumbnail_8_1,0,1
|
||||
9,series_thumbnail_9_1,0,1
|
||||
10,series_thumbnail_10_1,0,1
|
||||
11,series_thumbnail_11_1,0,1
|
||||
12,series_thumbnail_12_1,0,1
|
||||
13,series_thumbnail_13_1,0,1
|
||||
14,series_thumbnail_14_1,0,1
|
||||
15,series_thumbnail_15_1,0,1
|
||||
16,series_thumbnail_16_1,0,1
|
||||
17,series_thumbnail_17_1,0,1
|
||||
18,series_thumbnail_18_1,0,1
|
||||
19,series_thumbnail_19_1,0,1
|
||||
20,series_thumbnail_20_1,0,1
|
||||
21,series_thumbnail_21_1,0,1
|
||||
22,series_thumbnail_22_1,0,1
|
||||
23,series_thumbnail_23_1,0,1
|
||||
24,series_thumbnail_24_1,0,1
|
||||
25,series_thumbnail_25_1,0,1
|
||||
26,series_thumbnail_26_1,0,1
|
||||
27,series_thumbnail_27_1,0,1
|
||||
28,series_thumbnail_28_1,0,1
|
||||
29,series_thumbnail_29_1,0,1
|
||||
30,series_thumbnail_30_1,0,1
|
||||
31,series_thumbnail_31_1,0,1
|
||||
32,series_thumbnail_32_1,0,1
|
||||
33,series_thumbnail_33_1,0,1
|
||||
34,series_thumbnail_34_1,0,1
|
||||
35,series_thumbnail_35_1,0,1
|
||||
36,series_thumbnail_36_1,0,1
|
||||
37,series_thumbnail_37_1,0,1
|
||||
38,series_thumbnail_38_1,0,1
|
||||
39,series_thumbnail_39_1,0,1
|
||||
40,series_thumbnail_40_1,0,1
|
||||
41,series_thumbnail_41_1,0,1
|
||||
42,series_thumbnail_42_1,0,1
|
||||
43,series_thumbnail_43_1,0,1
|
||||
44,series_thumbnail_44_1,0,1
|
||||
45,series_thumbnail_45_1,0,1
|
||||
46,series_thumbnail_46_1,0,1
|
||||
47,series_thumbnail_47_1,0,1
|
||||
48,series_thumbnail_48_1,0,1
|
||||
49,series_thumbnail_49_1,0,1
|
||||
50,series_thumbnail_50_1,0,1
|
||||
51,series_thumbnail_51_1,0,1
|
||||
52,series_thumbnail_52_1,0,1
|
||||
53,series_thumbnail_53_1,0,1
|
||||
54,series_thumbnail_54_1,0,1
|
||||
55,series_thumbnail_55_1,0,1
|
||||
56,series_thumbnail_56_1,0,1
|
||||
57,series_thumbnail_57_1,0,1
|
||||
58,series_thumbnail_58_1,0,1
|
||||
59,series_thumbnail_59_1,0,1
|
||||
60,series_thumbnail_60_1,0,1
|
||||
61,series_thumbnail_61_1,0,1
|
||||
62,series_thumbnail_62_1,0,1
|
||||
63,series_thumbnail_63_1,0,1
|
||||
64,series_thumbnail_64_1,0,1
|
||||
65,series_thumbnail_65_1,0,1
|
||||
66,series_thumbnail_66_1,0,1
|
||||
67,series_thumbnail_67_1,0,1
|
||||
68,series_thumbnail_68_1,0,1
|
||||
69,series_thumbnail_69_1,0,1
|
||||
70,series_thumbnail_70_1,0,1
|
||||
71,series_thumbnail_71_1,0,1
|
||||
72,series_thumbnail_72_1,0,1
|
||||
73,series_thumbnail_73_1,0,1
|
||||
74,series_thumbnail_74_1,0,1
|
||||
75,series_thumbnail_75_1,0,1
|
||||
76,series_thumbnail_76_1,0,1
|
||||
77,series_thumbnail_77_1,0,1
|
||||
78,series_thumbnail_78_1,0,1
|
||||
79,series_thumbnail_79_1,0,1
|
||||
80,series_thumbnail_80_1,0,1
|
||||
81,series_thumbnail_81_1,0,1
|
||||
82,series_thumbnail_82_1,0,1
|
||||
83,series_thumbnail_83_1,0,1
|
||||
84,series_thumbnail_84_1,0,1
|
||||
85,series_thumbnail_85_1,0,1
|
||||
86,series_thumbnail_86_1,0,1
|
||||
87,series_thumbnail_87_1,0,1
|
||||
88,series_thumbnail_88_1,0,1
|
||||
89,series_thumbnail_89_1,0,1
|
||||
90,series_thumbnail_90_1,0,1
|
||||
91,series_thumbnail_91_1,0,1
|
||||
92,series_thumbnail_92_1,0,1
|
||||
93,series_thumbnail_93_1,0,1
|
||||
94,series_thumbnail_94_1,0,1
|
||||
95,series_thumbnail_95_1,0,1
|
||||
96,series_thumbnail_96_1,0,1
|
||||
97,series_thumbnail_97_1,0,1
|
||||
98,series_thumbnail_98_1,0,1
|
||||
99,series_thumbnail_99_1,0,1
|
||||
100,series_thumbnail_100_1,0,1
|
||||
101,series_thumbnail_101_1,0,1
|
||||
102,series_thumbnail_102_1,0,1
|
||||
103,series_thumbnail_103_1,0,1
|
||||
104,series_thumbnail_104_1,0,1
|
||||
105,series_thumbnail_105_1,0,1
|
||||
106,series_thumbnail_106_1,0,1
|
||||
107,series_thumbnail_107_1,0,1
|
||||
108,series_thumbnail_108_1,0,1
|
||||
109,series_thumbnail_109_1,0,1
|
||||
110,series_thumbnail_110_1,0,1
|
||||
111,series_thumbnail_111_1,0,1
|
||||
112,series_thumbnail_112_1,0,1
|
||||
113,series_thumbnail_113_1,0,1
|
||||
114,series_thumbnail_114_1,0,1
|
||||
115,series_thumbnail_115_1,0,1
|
||||
116,series_thumbnail_116_1,0,1
|
||||
117,series_thumbnail_117_1,0,1
|
||||
118,series_thumbnail_118_1,0,1
|
||||
119,series_thumbnail_119_1,0,1
|
||||
120,series_thumbnail_120_8,0,1
|
||||
121,series_thumbnail_121_8,0,1
|
||||
122,series_thumbnail_122_1,0,1
|
||||
123,series_thumbnail_123_1,0,1
|
||||
124,series_thumbnail_124_1,0,1
|
||||
125,series_thumbnail_125_1,0,1
|
||||
126,series_thumbnail_126_1,0,1
|
||||
127,series_thumbnail_127_1,0,1
|
||||
128,series_thumbnail_128_1,0,1
|
||||
129,series_thumbnail_0_1,0,1
|
||||
130,series_thumbnail_130_1,0,1
|
||||
131,series_thumbnail_0_1,0,1
|
||||
132,series_thumbnail_132_1,0,1
|
||||
133,series_thumbnail_133_1,0,1
|
||||
134,series_thumbnail_134_1,0,1
|
||||
135,series_thumbnail_135_1,0,1
|
||||
136,series_thumbnail_136_1,0,1
|
||||
137,series_thumbnail_0_1,0,1
|
||||
138,series_thumbnail_138_1,0,1
|
||||
139,series_thumbnail_139_1,0,1
|
||||
140,series_thumbnail_140_1,0,1
|
||||
141,series_thumbnail_141_1,0,1
|
||||
142,series_thumbnail_142_1,0,1
|
||||
143,series_thumbnail_143_1,0,1
|
||||
144,series_thumbnail_144_1,0,1
|
||||
145,series_thumbnail_145_1,0,1
|
||||
146,series_thumbnail_146_1,0,1
|
||||
147,series_thumbnail_147_1,0,1
|
||||
148,series_thumbnail_148_1,0,1
|
||||
149,series_thumbnail_149_1,0,1
|
||||
150,series_thumbnail_150_1,0,1
|
||||
151,series_thumbnail_151_1,0,1
|
||||
152,series_thumbnail_152_1,0,1
|
||||
153,series_thumbnail_153_1,0,1
|
||||
154,series_thumbnail_154_1,0,1
|
||||
155,series_thumbnail_155_1,0,1
|
||||
156,series_thumbnail_156_1,0,1
|
||||
157,series_thumbnail_157_1,0,1
|
||||
158,series_thumbnail_158_1,0,1
|
||||
159,series_thumbnail_159_1,0,1
|
||||
160,series_thumbnail_160_1,0,1
|
||||
161,series_thumbnail_161_1,0,1
|
||||
162,series_thumbnail_162_1,0,1
|
||||
163,series_thumbnail_163_1,0,1
|
||||
164,series_thumbnail_164_1,0,1
|
||||
165,series_thumbnail_165_1,0,1
|
||||
166,series_thumbnail_166_1,0,1
|
||||
167,series_thumbnail_167_1,0,1
|
||||
168,series_thumbnail_168_1,0,1
|
||||
169,series_thumbnail_169_1,0,1
|
||||
170,series_thumbnail_170_1,0,1
|
||||
171,series_thumbnail_0_1,0,1
|
||||
172,series_thumbnail_0_1,0,1
|
||||
173,series_thumbnail_173_1,0,1
|
||||
174,series_thumbnail_0_1,0,1
|
||||
175,series_thumbnail_0_1,0,1
|
||||
176,series_thumbnail_176_1,0,1
|
||||
177,series_thumbnail_0_1,0,1
|
||||
178,series_thumbnail_0_1,0,1
|
||||
179,series_thumbnail_179_1,0,1
|
||||
180,series_thumbnail_180_1,0,1
|
||||
181,series_thumbnail_0_1,0,1
|
||||
182,series_thumbnail_182_1,0,1
|
||||
183,series_thumbnail_183_1,0,1
|
||||
184,series_thumbnail_0_1,0,1
|
||||
185,series_thumbnail_0_1,0,1
|
||||
186,series_thumbnail_186_1,0,1
|
||||
187,series_thumbnail_0_1,0,1
|
||||
188,series_thumbnail_0_1,0,1
|
||||
189,series_thumbnail_0_1,0,1
|
||||
190,series_thumbnail_0_1,0,1
|
||||
191,series_thumbnail_191_1,0,1
|
||||
192,series_thumbnail_0_1,0,1
|
||||
193,series_thumbnail_193_1,0,1
|
||||
194,series_thumbnail_194_1,0,1
|
||||
195,series_thumbnail_195_1,0,1
|
||||
196,series_thumbnail_196_1,0,1
|
||||
197,series_thumbnail_197_1,0,1
|
||||
198,series_thumbnail_198_1,0,1
|
||||
199,series_thumbnail_199_1,0,1
|
||||
200,series_thumbnail_200_1,0,1
|
||||
201,series_thumbnail_201_1,0,1
|
||||
202,series_thumbnail_202_1,0,1
|
||||
203,series_thumbnail_203_1,0,1
|
||||
204,series_thumbnail_204_1,0,1
|
||||
205,series_thumbnail_205_1,0,1
|
||||
206,series_thumbnail_206_1,0,1
|
||||
207,series_thumbnail_207_1,0,1
|
||||
208,series_thumbnail_208_1,0,1
|
||||
209,series_thumbnail_209_1,0,1
|
||||
210,series_thumbnail_210_1,0,1
|
||||
211,series_thumbnail_211_1,0,1
|
||||
212,series_thumbnail_212_1,0,1
|
||||
213,series_thumbnail_213_1,0,1
|
||||
214,series_thumbnail_214_1,0,1
|
||||
215,series_thumbnail_215_1,0,1
|
||||
216,series_thumbnail_216_1,0,1
|
||||
217,series_thumbnail_217_1,0,1
|
||||
218,series_thumbnail_218_1,0,1
|
||||
219,series_thumbnail_219_1,0,1
|
||||
220,series_thumbnail_220_1,0,1
|
||||
221,series_thumbnail_221_1,0,1
|
||||
222,series_thumbnail_222_1,0,1
|
||||
223,series_thumbnail_223_1,0,1
|
||||
224,series_thumbnail_224_1,0,1
|
||||
225,series_thumbnail_225_1,0,1
|
||||
226,series_thumbnail_226_1,0,1
|
||||
227,series_thumbnail_227_1,0,1
|
||||
228,series_thumbnail_228_1,0,1
|
||||
229,series_thumbnail_229_1,0,1
|
||||
230,series_thumbnail_230_1,0,1
|
||||
231,series_thumbnail_231_1,0,1
|
||||
232,series_thumbnail_232_1,0,1
|
||||
233,series_thumbnail_233_1,0,1
|
||||
234,series_thumbnail_234_1,0,1
|
||||
235,series_thumbnail_235_1,0,1
|
||||
236,series_thumbnail_236_1,0,1
|
||||
237,series_thumbnail_237_1,0,1
|
||||
238,series_thumbnail_238_1,0,1
|
||||
239,series_thumbnail_239_1,0,1
|
||||
240,series_thumbnail_240_1,0,1
|
||||
241,series_thumbnail_241_1,0,1
|
||||
242,series_thumbnail_242_1,0,1
|
||||
243,series_thumbnail_243_1,0,1
|
||||
244,series_thumbnail_244_1,0,1
|
||||
245,series_thumbnail_245_1,0,1
|
||||
246,series_thumbnail_246_1,0,1
|
||||
247,series_thumbnail_247_1,0,1
|
||||
248,series_thumbnail_248_1,0,1
|
||||
249,series_thumbnail_249_1,0,1
|
||||
250,series_thumbnail_250_1,0,1
|
||||
251,series_thumbnail_251_1,0,1
|
||||
252,series_thumbnail_252_1,0,1
|
||||
253,series_thumbnail_253_1,0,1
|
||||
254,series_thumbnail_254_1,0,1
|
||||
255,series_thumbnail_255_1,0,1
|
||||
256,series_thumbnail_256_1,0,1
|
||||
257,series_thumbnail_257_1,0,1
|
||||
258,series_thumbnail_258_1,0,1
|
||||
259,series_thumbnail_259_1,0,1
|
||||
260,series_thumbnail_260_1,0,1
|
||||
261,series_thumbnail_261_1,0,1
|
||||
262,series_thumbnail_262_1,0,1
|
||||
263,series_thumbnail_263_1,0,1
|
||||
264,series_thumbnail_264_1,0,1
|
||||
265,series_thumbnail_265_1,0,1
|
||||
266,series_thumbnail_266_1,0,1
|
||||
267,series_thumbnail_267_1,0,1
|
||||
268,series_thumbnail_268_1,0,1
|
||||
269,series_thumbnail_269_1,0,1
|
||||
270,series_thumbnail_270_1,0,1
|
||||
271,series_thumbnail_271_1,0,1
|
||||
272,series_thumbnail_272_1,0,1
|
||||
273,series_thumbnail_273_1,0,1
|
||||
274,series_thumbnail_274_1,0,1
|
||||
275,series_thumbnail_275_1,0,1
|
||||
276,series_thumbnail_276_1,0,1
|
||||
277,series_thumbnail_277_1,0,1
|
||||
278,series_thumbnail_278_1,0,1
|
||||
279,series_thumbnail_279_1,0,1
|
||||
280,series_thumbnail_280_1,0,1
|
||||
281,series_thumbnail_281_1,0,1
|
||||
282,series_thumbnail_282_1,0,1
|
||||
283,series_thumbnail_283_1,0,1
|
||||
284,series_thumbnail_284_1,0,1
|
||||
285,series_thumbnail_285_1,0,1
|
||||
286,series_thumbnail_286_1,0,1
|
||||
287,series_thumbnail_287_1,0,1
|
||||
288,series_thumbnail_288_1,0,1
|
||||
289,series_thumbnail_289_1,0,1
|
||||
290,series_thumbnail_290_1,0,1
|
||||
291,series_thumbnail_291_1,0,1
|
||||
292,series_thumbnail_292_1,0,1
|
||||
293,series_thumbnail_293_1,0,1
|
||||
294,series_thumbnail_294_1,0,1
|
||||
295,series_thumbnail_295_1,0,1
|
||||
296,series_thumbnail_0_1,0,1
|
||||
297,series_thumbnail_297_1,0,1
|
||||
298,series_thumbnail_0_1,0,1
|
||||
299,series_thumbnail_299_1,0,1
|
||||
300,series_thumbnail_0_1,0,1
|
||||
301,series_thumbnail_0_1,0,1
|
||||
302,series_thumbnail_0_1,0,1
|
||||
303,series_thumbnail_303_1,0,1
|
||||
304,series_thumbnail_0_1,0,1
|
||||
305,series_thumbnail_0_1,0,1
|
||||
306,series_thumbnail_306_1,0,1
|
||||
307,series_thumbnail_307_1,0,1
|
||||
308,series_thumbnail_308_1,0,1
|
||||
309,series_thumbnail_0_1,0,1
|
||||
310,series_thumbnail_310_1,0,1
|
||||
311,series_thumbnail_0_1,0,1
|
||||
312,series_thumbnail_312_1,0,1
|
||||
313,series_thumbnail_313_1,0,1
|
||||
314,series_thumbnail_314_1,0,1
|
||||
315,series_thumbnail_315_1,0,1
|
||||
316,series_thumbnail_316_1,0,1
|
||||
317,series_thumbnail_317_1,0,1
|
||||
318,series_thumbnail_318_1,0,1
|
||||
319,series_thumbnail_319_1,0,1
|
||||
320,series_thumbnail_320_1,0,1
|
||||
321,series_thumbnail_321_1,0,1
|
||||
322,series_thumbnail_322_1,0,1
|
||||
323,series_thumbnail_323_1,0,1
|
||||
324,series_thumbnail_324_1,0,1
|
||||
325,series_thumbnail_325_1,0,1
|
||||
326,series_thumbnail_326_1,0,1
|
||||
327,series_thumbnail_327_1,0,1
|
||||
328,series_thumbnail_328_1,0,1
|
||||
329,series_thumbnail_0_1,0,1
|
||||
330,series_thumbnail_0_1,0,1
|
||||
331,series_thumbnail_331_1,0,1
|
||||
332,series_thumbnail_0_1,0,1
|
||||
333,series_thumbnail_0_1,0,1
|
||||
334,series_thumbnail_0_1,0,1
|
||||
335,series_thumbnail_335_1,0,1
|
||||
336,series_thumbnail_336_1,0,1
|
||||
337,series_thumbnail_337_1,0,1
|
||||
338,series_thumbnail_338_1,0,1
|
||||
339,series_thumbnail_339_1,0,1
|
||||
340,series_thumbnail_340_1,0,1
|
||||
341,series_thumbnail_341_1,0,1
|
||||
342,series_thumbnail_342_1,0,1
|
||||
343,series_thumbnail_343_1,0,1
|
||||
344,series_thumbnail_344_1,0,1
|
||||
345,series_thumbnail_345_1,0,1
|
||||
346,series_thumbnail_346_1,0,1
|
||||
347,series_thumbnail_347_1,0,1
|
||||
348,series_thumbnail_348_1,0,1
|
||||
349,series_thumbnail_349_1,0,1
|
||||
350,series_thumbnail_350_1,0,1
|
||||
351,series_thumbnail_351_1,0,1
|
||||
352,series_thumbnail_352_1,0,1
|
||||
353,series_thumbnail_353_1,0,1
|
||||
354,series_thumbnail_354_1,0,1
|
||||
355,series_thumbnail_355_1,0,1
|
||||
356,series_thumbnail_356_1,0,1
|
||||
357,series_thumbnail_357_1,0,1
|
||||
358,series_thumbnail_358_1,0,1
|
||||
359,series_thumbnail_359_1,0,1
|
||||
360,series_thumbnail_360_1,0,1
|
||||
361,series_thumbnail_361_1,0,1
|
||||
362,series_thumbnail_362_1,0,1
|
||||
363,series_thumbnail_363_1,0,1
|
||||
364,series_thumbnail_364_1,0,1
|
||||
365,series_thumbnail_365_1,0,1
|
||||
366,series_thumbnail_366_1,0,1
|
||||
367,series_thumbnail_367_1,0,1
|
||||
368,series_thumbnail_0_1,0,1
|
||||
369,series_thumbnail_369_2,0,1
|
||||
370,series_thumbnail_370_1,0,1
|
||||
371,series_thumbnail_371_1,0,1
|
||||
372,series_thumbnail_372_1,0,1
|
||||
373,series_thumbnail_373_1,0,1
|
||||
374,series_thumbnail_374_1,0,1
|
||||
375,series_thumbnail_0_1,0,1
|
||||
376,series_thumbnail_376_2,0,1
|
||||
377,series_thumbnail_377_1,0,1
|
||||
378,series_thumbnail_378_1,0,1
|
||||
379,series_thumbnail_379_1,0,1
|
||||
380,series_thumbnail_380_1,0,1
|
||||
381,series_thumbnail_381_1,0,1
|
||||
382,series_thumbnail_0_1,0,1
|
||||
383,series_thumbnail_383_2,0,1
|
||||
384,series_thumbnail_384_1,0,1
|
||||
385,series_thumbnail_385_1,0,1
|
||||
386,series_thumbnail_386_1,0,1
|
||||
387,series_thumbnail_387_1,0,1
|
||||
388,series_thumbnail_388_1,0,1
|
||||
389,series_thumbnail_0_1,0,1
|
||||
390,series_thumbnail_390_2,0,1
|
||||
391,series_thumbnail_391_1,0,1
|
||||
392,series_thumbnail_392_1,0,1
|
||||
393,series_thumbnail_393_1,0,1
|
||||
394,series_thumbnail_394_1,0,1
|
||||
395,series_thumbnail_395_1,0,1
|
||||
396,series_thumbnail_0_1,0,1
|
||||
397,series_thumbnail_397_2,0,1
|
||||
398,series_thumbnail_398_1,0,1
|
||||
399,series_thumbnail_399_1,0,1
|
||||
400,series_thumbnail_400_1,0,1
|
||||
401,series_thumbnail_401_1,0,1
|
||||
402,series_thumbnail_402_1,0,1
|
||||
403,series_thumbnail_0_1,0,1
|
||||
404,series_thumbnail_404_2,0,1
|
||||
405,series_thumbnail_0_1,0,1
|
||||
406,series_thumbnail_406_1,0,1
|
||||
407,series_thumbnail_407_1,0,1
|
||||
408,series_thumbnail_408_1,0,1
|
||||
409,series_thumbnail_409_1,0,1
|
||||
410,series_thumbnail_410_1,0,1
|
||||
411,series_thumbnail_411_1,0,1
|
||||
412,series_thumbnail_412_1,0,1
|
||||
413,series_thumbnail_413_1,0,1
|
||||
414,series_thumbnail_414_2,0,1
|
||||
415,series_thumbnail_0_1,0,1
|
||||
416,series_thumbnail_416_1,0,1
|
||||
417,series_thumbnail_417_1,0,1
|
||||
418,series_thumbnail_418_1,0,1
|
||||
419,series_thumbnail_419_1,0,1
|
||||
420,series_thumbnail_420_2,0,1
|
||||
421,series_thumbnail_421_9,0,1
|
||||
422,series_thumbnail_422_9,0,1
|
||||
423,series_thumbnail_423_1,0,1
|
||||
424,series_thumbnail_424_1,0,1
|
||||
425,series_thumbnail_425_1,0,1
|
||||
426,series_thumbnail_426_1,0,1
|
||||
427,series_thumbnail_427_1,0,1
|
||||
428,series_thumbnail_428_1,0,1
|
||||
429,series_thumbnail_429_1,0,1
|
||||
430,series_thumbnail_430_1,0,1
|
||||
431,series_thumbnail_431_1,0,1
|
||||
432,series_thumbnail_432_1,0,1
|
||||
433,series_thumbnail_433_1,0,1
|
||||
434,series_thumbnail_434_1,0,1
|
||||
435,series_thumbnail_435_1,0,1
|
||||
436,series_thumbnail_436_2,0,1
|
||||
437,series_thumbnail_437_9,0,1
|
||||
438,series_thumbnail_438_1,0,1
|
||||
439,series_thumbnail_439_1,0,1
|
||||
440,series_thumbnail_440_2,0,1
|
||||
441,series_thumbnail_441_9,0,1
|
||||
442,series_thumbnail_442_1,0,1
|
||||
443,series_thumbnail_443_1,0,1
|
||||
444,series_thumbnail_444_2,0,1
|
||||
445,series_thumbnail_445_1,0,1
|
||||
446,series_thumbnail_446_1,0,1
|
||||
447,series_thumbnail_447_1,0,1
|
||||
448,series_thumbnail_448_1,0,1
|
||||
449,series_thumbnail_449_2,0,1
|
||||
450,series_thumbnail_450_1,0,1
|
||||
451,series_thumbnail_451_2,0,1
|
||||
452,series_thumbnail_452_1,0,1
|
||||
453,series_thumbnail_453_1,0,1
|
||||
454,series_thumbnail_454_2,0,1
|
||||
455,series_thumbnail_455_2,0,1
|
||||
456,series_thumbnail_456_1,0,1
|
||||
457,series_thumbnail_457_1,0,1
|
||||
458,series_thumbnail_458_1,0,1
|
||||
459,series_thumbnail_459_1,0,1
|
||||
460,series_thumbnail_460_2,0,1
|
||||
461,series_thumbnail_461_1,0,1
|
||||
462,series_thumbnail_462_1,0,1
|
||||
463,series_thumbnail_463_1,0,1
|
||||
464,series_thumbnail_464_2,0,1
|
||||
465,series_thumbnail_465_2,0,1
|
||||
466,series_thumbnail_466_1,0,1
|
||||
467,series_thumbnail_467_2,0,1
|
||||
468,series_thumbnail_468_9,0,1
|
||||
469,series_thumbnail_469_1,0,1
|
||||
470,series_thumbnail_470_9,0,1
|
||||
471,series_thumbnail_471_2,0,1
|
||||
472,series_thumbnail_472_1,0,1
|
||||
473,series_thumbnail_473_2,0,1
|
||||
474,series_thumbnail_474_1,0,1
|
||||
475,series_thumbnail_475_1,0,1
|
||||
476,series_thumbnail_476_1,0,1
|
||||
477,series_thumbnail_477_2,0,1
|
||||
478,series_thumbnail_478_1,0,1
|
||||
479,series_thumbnail_479_1,0,1
|
||||
480,series_thumbnail_480_1,0,1
|
||||
481,series_thumbnail_481_1,0,1
|
||||
482,series_thumbnail_482_1,0,1
|
||||
484,series_thumbnail_484_2,0,1
|
||||
485,series_thumbnail_485_9,0,1
|
||||
486,series_thumbnail_486_2,0,1
|
||||
487,series_thumbnail_487_9,0,1
|
||||
488,series_thumbnail_488_9,0,1
|
||||
489,series_thumbnail_489_1,0,1
|
||||
490,series_thumbnail_490_2,0,1
|
||||
491,series_thumbnail_491_9,0,1
|
||||
492,series_thumbnail_492_2,0,1
|
||||
493,series_thumbnail_493_2,0,1
|
||||
494,series_thumbnail_494_2,0,1
|
||||
495,series_thumbnail_495_2,0,1
|
||||
496,series_thumbnail_496_2,0,1
|
||||
497,series_thumbnail_497_2,0,1
|
||||
498,series_thumbnail_498_2,0,1
|
||||
499,series_thumbnail_499_2,0,1
|
||||
500,series_thumbnail_500_1,0,1
|
||||
501,series_thumbnail_501_1,0,1
|
||||
502,series_thumbnail_502_8,0,1
|
||||
503,series_thumbnail_503_8,0,1
|
||||
504,series_thumbnail_504_1,0,1
|
||||
505,series_thumbnail_505_1,0,1
|
||||
506,series_thumbnail_506_1,0,1
|
||||
507,series_thumbnail_507_2,0,1
|
||||
508,series_thumbnail_508_2,0,1
|
||||
509,series_thumbnail_509_2,0,1
|
||||
510,series_thumbnail_510_1,0,1
|
||||
511,series_thumbnail_511_2,0,1
|
||||
512,series_thumbnail_512_1,0,1
|
||||
513,series_thumbnail_513_1,0,1
|
||||
514,series_thumbnail_514_2,0,1
|
||||
515,series_thumbnail_515_1,0,1
|
||||
516,series_thumbnail_516_2,0,1
|
||||
517,series_thumbnail_517_1,0,1
|
||||
518,series_thumbnail_0_1,0,1
|
||||
519,series_thumbnail_0_1,0,1
|
||||
520,series_thumbnail_0_1,0,1
|
||||
521,series_thumbnail_0_1,0,1
|
||||
522,series_thumbnail_0_1,0,1
|
||||
523,series_thumbnail_523_2,0,1
|
||||
524,series_thumbnail_524_1,0,1
|
||||
525,series_thumbnail_525_1,0,1
|
||||
526,series_thumbnail_526_1,0,1
|
||||
527,series_thumbnail_527_1,0,1
|
||||
528,series_thumbnail_528_1,0,1
|
||||
529,series_thumbnail_529_1,0,1
|
||||
530,series_thumbnail_530_3,0,1
|
||||
531,series_thumbnail_531_1,0,1
|
||||
532,series_thumbnail_532_1,0,1
|
||||
533,series_thumbnail_533_3,0,1
|
||||
534,series_thumbnail_534_2,0,1
|
||||
535,series_thumbnail_535_1,0,1
|
||||
536,series_thumbnail_536_3,0,1
|
||||
537,series_thumbnail_537_3,0,1
|
||||
538,series_thumbnail_538_3,0,1
|
||||
539,series_thumbnail_539_3,0,1
|
||||
540,series_thumbnail_540_3,0,1
|
||||
541,series_thumbnail_541_1,0,1
|
||||
542,series_thumbnail_542_3,0,1
|
||||
543,series_thumbnail_543_1,0,1
|
||||
544,series_thumbnail_544_1,0,1
|
||||
545,series_thumbnail_545_1,0,1
|
||||
546,series_thumbnail_546_1,0,1
|
||||
547,series_thumbnail_547_1,0,1
|
||||
548,series_thumbnail_548_1,0,1
|
||||
549,series_thumbnail_549_1,0,1
|
||||
550,series_thumbnail_550_1,0,1
|
||||
551,series_thumbnail_551_1,0,1
|
||||
552,series_thumbnail_552_1,0,1
|
||||
553,series_thumbnail_553_1,0,1
|
||||
554,series_thumbnail_554_1,0,1
|
||||
555,series_thumbnail_555_1,0,1
|
||||
556,series_thumbnail_556_1,0,1
|
||||
557,series_thumbnail_557_1,0,1
|
||||
558,series_thumbnail_558_1,0,1
|
||||
559,series_thumbnail_559_1,0,1
|
||||
560,series_thumbnail_560_1,0,1
|
||||
561,series_thumbnail_561_1,0,1
|
||||
562,series_thumbnail_562_1,0,1
|
||||
563,series_thumbnail_563_1,0,1
|
||||
564,series_thumbnail_564_1,0,1
|
||||
565,series_thumbnail_565_2,0,1
|
||||
566,series_thumbnail_566_1,0,1
|
||||
567,series_thumbnail_567_1,0,1
|
||||
568,series_thumbnail_568_1,0,1
|
||||
569,series_thumbnail_569_1,0,1
|
||||
570,series_thumbnail_570_2,0,1
|
||||
571,series_thumbnail_571_1,0,1
|
||||
572,series_thumbnail_572_1,0,1
|
||||
573,series_thumbnail_573_1,0,1
|
||||
574,series_thumbnail_574_1,0,1
|
||||
575,series_thumbnail_575_1,0,1
|
||||
576,series_thumbnail_576_1,0,1
|
||||
577,series_thumbnail_577_1,0,1
|
||||
578,series_thumbnail_578_1,0,1
|
||||
579,series_thumbnail_579_1,0,1
|
||||
580,series_thumbnail_580_1,0,1
|
||||
581,series_thumbnail_581_1,0,1
|
||||
584,series_thumbnail_584_1,0,1
|
||||
587,series_thumbnail_587_1,0,1
|
||||
|
3906
src/router/databases/csv-en/album_unit_m.csv
Normal file
3906
src/router/databases/csv-en/album_unit_m.csv
Normal file
File diff suppressed because it is too large
Load Diff
409
src/router/databases/csv-en/album_unit_pair_m.csv
Normal file
409
src/router/databases/csv-en/album_unit_pair_m.csv
Normal file
@@ -0,0 +1,409 @@
|
||||
_unitPairId,_pair,_unitId,_position,_rank,_masterReleaseLabelId
|
||||
1,1,138,0,1,1
|
||||
2,1,132,1,1,1
|
||||
3,2,138,0,2,1
|
||||
4,2,132,1,2,1
|
||||
5,3,156,0,1,1
|
||||
6,3,149,1,1,1
|
||||
7,4,149,0,2,1
|
||||
8,4,156,1,2,1
|
||||
9,5,165,0,1,1
|
||||
10,5,172,1,1,1
|
||||
11,6,165,0,2,1
|
||||
12,6,172,1,2,1
|
||||
13,7,180,0,1,1
|
||||
14,7,188,1,1,1
|
||||
15,8,188,0,2,1
|
||||
16,8,180,1,2,1
|
||||
17,9,196,0,1,1
|
||||
18,9,203,1,1,1
|
||||
19,10,203,0,2,1
|
||||
20,10,196,1,2,1
|
||||
21,11,213,0,1,1
|
||||
22,11,222,1,1,1
|
||||
23,12,213,0,2,1
|
||||
24,12,222,1,2,1
|
||||
25,13,249,0,1,1
|
||||
26,13,257,1,1,1
|
||||
27,14,257,0,2,1
|
||||
28,14,249,1,2,1
|
||||
29,15,272,0,1,1
|
||||
30,15,265,1,1,1
|
||||
31,16,265,0,2,1
|
||||
32,16,272,1,2,1
|
||||
33,17,298,0,1,1
|
||||
34,17,282,1,1,1
|
||||
35,18,298,0,2,1
|
||||
36,18,282,1,2,1
|
||||
37,19,322,0,1,1
|
||||
38,19,315,1,1,1
|
||||
39,20,315,0,2,1
|
||||
40,20,322,1,2,1
|
||||
41,21,338,0,1,1
|
||||
42,21,330,1,1,1
|
||||
43,22,338,0,2,1
|
||||
44,22,330,1,2,1
|
||||
45,23,367,0,1,1
|
||||
46,23,358,1,1,1
|
||||
47,24,358,0,2,1
|
||||
48,24,367,1,2,1
|
||||
49,25,397,0,1,1
|
||||
50,25,378,1,1,1
|
||||
51,26,397,0,2,1
|
||||
52,26,378,1,2,1
|
||||
53,27,408,0,1,1
|
||||
54,27,415,1,1,1
|
||||
55,28,415,0,2,1
|
||||
56,28,408,1,2,1
|
||||
57,29,442,0,1,1
|
||||
58,29,425,1,1,1
|
||||
59,30,442,0,2,1
|
||||
60,30,425,1,2,1
|
||||
61,31,463,0,1,1
|
||||
62,31,456,1,1,1
|
||||
63,32,463,0,2,1
|
||||
64,32,456,1,2,1
|
||||
65,33,483,0,1,1
|
||||
66,33,476,1,1,1
|
||||
67,34,483,0,2,1
|
||||
68,34,476,1,2,1
|
||||
69,35,507,0,1,1
|
||||
70,35,514,1,1,1
|
||||
71,36,507,0,2,1
|
||||
72,36,514,1,2,1
|
||||
73,37,538,0,1,1
|
||||
74,37,531,1,1,1
|
||||
75,38,531,0,2,1
|
||||
76,38,538,1,2,1
|
||||
77,39,549,0,1,1
|
||||
78,39,556,1,1,1
|
||||
79,40,556,0,2,1
|
||||
80,40,549,1,2,1
|
||||
81,41,574,0,1,1
|
||||
82,41,581,1,1,1
|
||||
83,42,574,0,2,1
|
||||
84,42,581,1,2,1
|
||||
85,43,592,0,1,1
|
||||
86,43,602,1,1,1
|
||||
87,44,602,0,2,1
|
||||
88,44,592,1,2,1
|
||||
89,45,637,0,1,1
|
||||
90,45,611,1,1,1
|
||||
91,46,637,0,2,1
|
||||
92,46,611,1,2,1
|
||||
93,47,652,0,1,1
|
||||
94,47,645,1,1,1
|
||||
95,48,652,0,2,1
|
||||
96,48,645,1,2,1
|
||||
97,49,668,0,1,1
|
||||
98,49,661,1,1,1
|
||||
99,50,668,0,2,1
|
||||
100,50,661,1,2,1
|
||||
101,51,677,0,1,1
|
||||
102,51,693,1,1,1
|
||||
103,52,693,0,2,1
|
||||
104,52,677,1,2,1
|
||||
105,53,703,0,1,1
|
||||
106,53,710,1,1,1
|
||||
107,54,703,0,2,1
|
||||
108,54,710,1,2,1
|
||||
109,55,728,0,1,1
|
||||
110,55,735,1,1,1
|
||||
111,56,728,0,2,1
|
||||
112,56,735,1,2,1
|
||||
113,57,763,0,1,1
|
||||
114,57,746,1,1,1
|
||||
115,58,746,0,2,1
|
||||
116,58,763,1,2,1
|
||||
117,59,781,0,1,1
|
||||
118,59,774,1,1,1
|
||||
119,60,781,0,2,1
|
||||
120,60,774,1,2,1
|
||||
121,61,801,0,1,1
|
||||
122,61,817,1,1,1
|
||||
123,62,801,0,2,1
|
||||
124,62,817,1,2,1
|
||||
125,63,842,0,1,1
|
||||
126,63,826,1,1,1
|
||||
127,64,826,0,2,1
|
||||
128,64,842,1,2,1
|
||||
129,65,854,0,1,1
|
||||
130,65,864,1,1,1
|
||||
131,66,854,0,2,1
|
||||
132,66,864,1,2,1
|
||||
133,67,873,0,1,1
|
||||
134,67,883,1,1,1
|
||||
135,68,883,0,2,1
|
||||
136,68,873,1,2,1
|
||||
137,69,902,0,1,1
|
||||
138,69,891,1,1,1
|
||||
139,70,902,0,2,1
|
||||
140,70,891,1,2,1
|
||||
141,71,911,0,1,1
|
||||
142,71,967,1,1,1
|
||||
143,72,911,0,2,1
|
||||
144,72,967,1,2,1
|
||||
145,73,976,0,1,1
|
||||
146,73,987,1,1,1
|
||||
147,74,987,0,2,1
|
||||
148,74,976,1,2,1
|
||||
149,75,1004,0,1,1
|
||||
150,75,982,1,1,1
|
||||
151,76,982,0,2,1
|
||||
152,76,1004,1,2,1
|
||||
153,77,1009,0,1,1
|
||||
154,77,999,1,1,1
|
||||
155,78,999,0,2,1
|
||||
156,78,1009,1,2,1
|
||||
157,79,1032,0,1,1
|
||||
158,79,1020,1,1,1
|
||||
159,80,1032,0,2,1
|
||||
160,80,1020,1,2,1
|
||||
161,81,1027,0,1,1
|
||||
162,81,1048,1,1,1
|
||||
163,82,1048,0,2,1
|
||||
164,82,1027,1,2,1
|
||||
165,83,1055,0,1,1
|
||||
166,83,1043,1,1,1
|
||||
167,84,1043,0,2,1
|
||||
168,84,1055,1,2,1
|
||||
170,85,1068,0,1,1
|
||||
169,85,1080,1,1,1
|
||||
172,86,1080,0,2,1
|
||||
171,86,1068,1,2,1
|
||||
173,87,1109,0,1,1
|
||||
174,87,1075,1,1,1
|
||||
175,88,1075,0,2,1
|
||||
176,88,1109,1,2,1
|
||||
177,89,1114,0,1,1
|
||||
178,89,1104,1,1,1
|
||||
179,90,1114,0,2,1
|
||||
180,90,1104,1,2,1
|
||||
181,91,1125,0,1,1
|
||||
182,91,1136,1,1,1
|
||||
183,92,1125,0,2,1
|
||||
184,92,1136,1,2,1
|
||||
185,93,1153,0,1,1
|
||||
186,93,1131,1,1,1
|
||||
187,94,1131,0,2,1
|
||||
188,94,1153,1,2,1
|
||||
189,95,1158,0,1,1
|
||||
190,95,1148,1,1,1
|
||||
191,96,1158,0,2,1
|
||||
192,96,1148,1,2,1
|
||||
193,97,1182,0,1,1
|
||||
194,97,1169,1,1,1
|
||||
195,98,1169,0,2,1
|
||||
196,98,1182,1,2,1
|
||||
197,99,1198,0,1,1
|
||||
198,99,1177,1,1,1
|
||||
199,100,1198,0,2,1
|
||||
200,100,1177,1,2,1
|
||||
201,101,1193,0,1,1
|
||||
202,101,1203,1,1,1
|
||||
203,102,1193,0,2,1
|
||||
204,102,1203,1,2,1
|
||||
205,103,1225,0,1,1
|
||||
206,103,1214,1,1,1
|
||||
207,104,1214,0,2,1
|
||||
208,104,1225,1,2,1
|
||||
209,105,1220,0,1,1
|
||||
210,105,1242,1,1,1
|
||||
211,106,1220,0,2,1
|
||||
212,106,1242,1,2,1
|
||||
213,107,1237,0,1,1
|
||||
214,107,1265,1,1,1
|
||||
215,108,1265,0,2,1
|
||||
216,108,1237,1,2,1
|
||||
217,109,1276,0,1,1
|
||||
218,109,1287,1,1,1
|
||||
219,110,1276,0,2,1
|
||||
220,110,1287,1,2,1
|
||||
221,111,1303,0,1,1
|
||||
222,111,1282,1,1,1
|
||||
223,112,1303,0,2,1
|
||||
224,112,1282,1,2,1
|
||||
225,113,1298,0,1,1
|
||||
226,113,1308,1,1,1
|
||||
227,114,1298,0,2,1
|
||||
228,114,1308,1,2,1
|
||||
229,115,1342,0,1,1
|
||||
230,115,1328,1,1,1
|
||||
231,116,1342,0,2,1
|
||||
232,116,1328,1,2,1
|
||||
233,117,1334,0,1,1
|
||||
234,117,1367,1,1,1
|
||||
235,118,1334,0,2,1
|
||||
236,118,1367,1,2,1
|
||||
237,119,1353,0,1,1
|
||||
238,119,1372,1,1,1
|
||||
239,120,1353,0,2,1
|
||||
240,120,1372,1,2,1
|
||||
241,121,1383,0,1,1
|
||||
242,121,1399,1,1,1
|
||||
243,122,1383,0,2,1
|
||||
244,122,1399,1,2,1
|
||||
245,123,1394,0,1,1
|
||||
246,123,1433,1,1,1
|
||||
247,124,1394,0,2,1
|
||||
248,124,1433,1,2,1
|
||||
249,125,1425,0,1,1
|
||||
250,125,1438,1,1,1
|
||||
251,126,1438,0,2,1
|
||||
252,126,1425,1,2,1
|
||||
253,127,1473,0,1,1
|
||||
254,127,1459,1,1,1
|
||||
255,128,1459,0,2,1
|
||||
256,128,1473,1,2,1
|
||||
257,129,1496,0,1,1
|
||||
258,129,1468,1,1,1
|
||||
259,130,1496,0,2,1
|
||||
260,130,1468,1,2,1
|
||||
261,131,1485,0,1,1
|
||||
262,131,1503,1,1,1
|
||||
263,132,1485,0,2,1
|
||||
264,132,1503,1,2,1
|
||||
265,133,1561,0,1,1
|
||||
266,133,1526,1,1,1
|
||||
267,134,1561,0,2,1
|
||||
268,134,1526,1,2,1
|
||||
269,135,1556,0,1,1
|
||||
270,135,1592,1,1,1
|
||||
271,136,1556,0,2,1
|
||||
272,136,1592,1,2,1
|
||||
273,137,1596,0,1,1
|
||||
274,137,1578,1,1,1
|
||||
275,138,1596,0,2,1
|
||||
276,138,1578,1,2,1
|
||||
277,139,1629,0,1,1
|
||||
278,139,1613,1,1,1
|
||||
279,140,1629,0,2,1
|
||||
280,140,1613,1,2,1
|
||||
281,141,1625,0,1,1
|
||||
282,141,1656,1,1,1
|
||||
283,142,1625,0,2,1
|
||||
284,142,1656,1,2,1
|
||||
285,143,1649,0,1,1
|
||||
286,143,1660,1,1,1
|
||||
287,144,1660,0,2,1
|
||||
288,144,1649,1,2,1
|
||||
289,145,1672,0,1,1
|
||||
290,145,1696,1,1,1
|
||||
291,146,1672,0,2,1
|
||||
292,146,1696,1,2,1
|
||||
293,147,1691,0,1,1
|
||||
294,147,1724,1,1,1
|
||||
295,148,1724,0,2,1
|
||||
296,148,1691,1,2,1
|
||||
297,149,1707,0,1,1
|
||||
298,149,1730,1,1,1
|
||||
299,150,1730,0,2,1
|
||||
300,150,1707,1,2,1
|
||||
301,151,1766,0,1,1
|
||||
302,151,1743,1,1,1
|
||||
303,152,1766,0,2,1
|
||||
304,152,1743,1,2,1
|
||||
305,153,1789,0,1,1
|
||||
306,153,1761,1,1,1
|
||||
307,154,1761,0,2,1
|
||||
308,154,1789,1,2,1
|
||||
309,155,1782,0,1,1
|
||||
310,155,1793,1,1,1
|
||||
311,156,1782,0,2,1
|
||||
312,156,1793,1,2,1
|
||||
313,157,1813,0,1,1
|
||||
314,157,1836,1,1,1
|
||||
315,158,1813,0,2,1
|
||||
316,158,1836,1,2,1
|
||||
317,159,1878,0,1,1
|
||||
318,159,1832,1,1,1
|
||||
319,160,1832,0,2,1
|
||||
320,160,1878,1,2,1
|
||||
321,161,1882,0,1,1
|
||||
322,161,1850,1,1,1
|
||||
323,162,1882,0,2,1
|
||||
324,162,1850,1,2,1
|
||||
325,163,1916,0,1,1
|
||||
326,163,1904,1,1,1
|
||||
327,164,1916,0,2,1
|
||||
328,164,1904,1,2,1
|
||||
329,165,1912,0,1,1
|
||||
330,165,1943,1,1,1
|
||||
331,166,1943,0,2,1
|
||||
332,166,1912,1,2,1
|
||||
333,167,1936,0,1,1
|
||||
334,167,1949,1,1,1
|
||||
335,168,1949,0,2,1
|
||||
336,168,1936,1,2,1
|
||||
337,169,2001,0,1,1
|
||||
338,169,1966,1,1,1
|
||||
339,170,2001,0,2,1
|
||||
340,170,1966,1,2,1
|
||||
341,171,2030,0,1,1
|
||||
342,171,1997,1,1,1
|
||||
343,172,1997,0,2,1
|
||||
344,172,2030,1,2,1
|
||||
345,173,2021,0,1,1
|
||||
346,173,2034,1,1,1
|
||||
347,174,2034,0,2,1
|
||||
348,174,2021,1,2,1
|
||||
349,175,2051,0,1,1
|
||||
350,175,2069,1,1,1
|
||||
351,176,2069,0,2,1
|
||||
352,176,2051,1,2,1
|
||||
353,177,2063,0,1,1
|
||||
354,177,2085,1,1,1
|
||||
355,178,2085,0,2,1
|
||||
356,178,2063,1,2,1
|
||||
357,179,2092,0,1,1
|
||||
358,179,2080,1,1,1
|
||||
359,180,2092,0,2,1
|
||||
360,180,2080,1,2,1
|
||||
361,181,2115,0,1,1
|
||||
362,181,2138,1,1,1
|
||||
363,182,2138,0,2,1
|
||||
364,182,2115,1,2,1
|
||||
365,183,2133,0,1,1
|
||||
366,183,2163,1,1,1
|
||||
367,184,2163,0,2,1
|
||||
368,184,2133,1,2,1
|
||||
369,185,2169,0,1,1
|
||||
370,185,2158,1,1,1
|
||||
371,186,2158,0,2,1
|
||||
372,186,2169,1,2,1
|
||||
373,187,2200,0,1,1
|
||||
374,187,2189,1,1,1
|
||||
375,188,2200,0,2,1
|
||||
376,188,2189,1,2,1
|
||||
377,189,2195,0,1,1
|
||||
378,189,2218,1,1,1
|
||||
379,190,2218,0,2,1
|
||||
380,190,2195,1,2,1
|
||||
381,191,2213,0,1,1
|
||||
382,191,2223,1,1,1
|
||||
383,192,2223,0,2,1
|
||||
384,192,2213,1,2,1
|
||||
385,193,2247,0,1,1
|
||||
386,193,2236,1,1,1
|
||||
387,194,2236,0,2,1
|
||||
388,194,2247,1,2,1
|
||||
389,195,2242,0,1,1
|
||||
390,195,2268,1,1,1
|
||||
391,196,2268,0,2,1
|
||||
392,196,2242,1,2,1
|
||||
393,197,2274,0,1,1
|
||||
394,197,2263,1,1,1
|
||||
395,198,2263,0,2,1
|
||||
396,198,2274,1,2,1
|
||||
397,199,2286,0,1,1
|
||||
398,199,2298,1,1,1
|
||||
399,200,2286,0,2,1
|
||||
400,200,2298,1,2,1
|
||||
401,201,2317,0,1,1
|
||||
402,201,2293,1,1,1
|
||||
403,202,2293,0,2,1
|
||||
404,202,2317,1,2,1
|
||||
405,203,2325,0,1,1
|
||||
406,203,2310,1,1,1
|
||||
407,204,2310,0,2,1
|
||||
408,204,2325,1,2,1
|
||||
|
3963
src/router/databases/csv-en/album_unit_series_m.csv
Normal file
3963
src/router/databases/csv-en/album_unit_series_m.csv
Normal file
File diff suppressed because it is too large
Load Diff
287
src/router/databases/csv-en/album_unit_type.csv
Normal file
287
src/router/databases/csv-en/album_unit_type.csv
Normal file
@@ -0,0 +1,287 @@
|
||||
_unitTypeId,_name,_nameAlpha,_age,_birthday,_bloodType,_height,_cv,_masterReleaseLabelId
|
||||
1,高坂穂乃果,HONOKA KOSAKA,2,8月3日,O型,157,新田恵海,1
|
||||
2,絢瀬絵里,ELI AYASE,3,10月21日,B型,162,南條愛乃,1
|
||||
3,南ことり,KOTORI MINAMI,2,9月12日,O型,159,内田 彩,1
|
||||
4,園田海未,UMI SONODA,2,3月15日,A型,159,三森すずこ,1
|
||||
5,星空凛,RIN HOSHIZORA,1,11月1日,A型,155,飯田里穂,1
|
||||
6,西木野真姫,MAKI NISHIKINO,1,4月19日,AB型,161,Pile,1
|
||||
7,東條希,NOZOMI TOJO,3,6月9日,O型,159,楠田亜衣奈,1
|
||||
8,小泉花陽,HANAYO KOIZUMI,1,1月17日,B型,156,久保ユリカ,1
|
||||
9,矢澤にこ,NICO YAZAWA,3,7月22日,A型,154,徳井青空,1
|
||||
10,μ's,μ's,?,?月?日,?型,?,????,1
|
||||
11,桜坂しずく,SHIZUKU OSAKA,1,4月3日,A型,157,????,1
|
||||
12,宮下ココ,COCO MIYASHITA,1,6月2日,A型,155,????,1
|
||||
13,逢沢遊宇,YUU AIZAWA,1,7月7日,O型,157,????,1
|
||||
14,一之瀬マリカ,MARIKA ICHINOSE,2,4月20日,B型,161,????,1
|
||||
15,結城紗菜,SANA YUKI,2,8月20日,B型,160,????,1
|
||||
16,西村文絵,FUMIE NISHIMURA,2,9月20日,B型,156,????,1
|
||||
17,永山みなみ,MINAMI NAGAYAMA,3,8月30日,O型,163,????,1
|
||||
18,クリスティーナ,CHRISTINA,3,1月21日,A型,161,????,1
|
||||
19,菊池朱美,AKEMI KIKUCHI,3,10月30日,B型,160,????,1
|
||||
20,須田いるか,IRUKA SUDA,1,2月18日,O型,159,????,1
|
||||
21,杉崎亜矢,AYA SUGISAKI,1,9月30日,O型,153,????,1
|
||||
22,御堂優理,YURI MIDO,1,12月24日,A型,164,????,1
|
||||
23,佐伯麗音,REINE SAEKI,2,6月16日,A型,155,????,1
|
||||
24,鳥居歩美,AYUMI TORII,2,3月8日,A型,154,????,1
|
||||
25,神谷理華,RIKA KAMIYA,2,1月7日,A型,159,????,1
|
||||
26,森嶋ななか,NANAKA MORISHIMA,3,3月7日,B型,163,????,1
|
||||
27,九条聖来,SEIRA KUJO,3,11月15日,O型,158,????,1
|
||||
28,近江彼方,KANATA KONOE,3,12月16日,O型,158,????,1
|
||||
29,近江遥,HARUKA KONOE,1,11月11日,A型,154,????,1
|
||||
30,下園咲,SAKI SHIMOZONO,1,5月5日,A型,158,????,1
|
||||
31,田中さち子,SACHIKO TANAKA,1,9月3日,AB型,156,????,1
|
||||
32,支倉かさね,KASANE HASEKURA,2,12月12日,O型,161,????,1
|
||||
33,多々良るう,RU TATARA,2,3月25日,A型,152,????,1
|
||||
34,篠宮あきる,AKIRU SHINOMIYA,2,7月20日,O型,160,????,1
|
||||
35,吉川瑞希,MIZUKI KIKKAWA,3,10月20日,A型,167,????,1
|
||||
36,白木凪,NAGI SHIRAKI,3,2月9日,B型,150,????,1
|
||||
37,藤城悠弓,YUMI FUJISHIRO,3,5月15日,AB型,165,????,1
|
||||
38,深山聡子,SATOKO MIYAMA,?,6月8日,O型,164,????,1
|
||||
39,山内奈々子,NANAKO YAMAUCHI,?,12月8日,A型,153,????,1
|
||||
40,笹原京子,KYOKO SASAHARA,?,9月8日,B型,168,????,1
|
||||
41,黒崎隼,SHUN KUROSAKI,2,6月15日,O型,163,????,1
|
||||
42,設楽ふみ,FUMI SHITARA,1,3月20日,AB型,151,????,1
|
||||
43,門田剣,TSURUGI KADOTA,3,7月10日,A型,168,????,1
|
||||
44,アルパカ[白],alpaca,?,?月?日,?型,?,????,1
|
||||
45,桐原優香,YUUKA KIRIHARA,2,4月2日,A型,158,????,1
|
||||
46,斉木風,FUU SAIKI,1,8月12日,O型,162,????,1
|
||||
47,福原命,MIKOTO FUKUHARA,1,11月5日,A型,147,????,1
|
||||
48,坂巻千鶴子,CHIDUKO SAKAMAKI,2,7月14日,O型,162,????,1
|
||||
49,志賀仁美,HITOMI SHIGA,3,6月6日,B型,167,????,1
|
||||
50,鬼崎アキラ,AKIRA KIZAKI,2,8月10日,A型,164,????,1
|
||||
51,紫藤美咲,MISAKI SHIDO,3,4月7日,AB型,167,????,1
|
||||
52,月島結架,YUKA TSUKISHIMA,2,7月21日,B型,158,????,1
|
||||
53,兵藤さゆり,SAYURI HYODO,3,4月22日,O型,163,????,1
|
||||
54,蘭花,RANPHA,1,2月8日,A型,154,????,1
|
||||
55,ラクシャータ,RAKSHATA,2,6月18日,O型,157,????,1
|
||||
56,レベッカ,REBECCA,2,11月14日,A型,167,????,1
|
||||
57,綾小路姫乃,HIMENO AYANOKOJI,2,4月17日,A型,158,????,1
|
||||
58,黒羽咲良,SAKURA KUROBANE,1,4月4日,AB型,162,????,1
|
||||
59,黒羽咲夜,SAKUYA KUROBANE,3,9月9日,AB型,160,????,1
|
||||
60,白瀬小雪,KOYUKI SHIRASE,1,2月23日,B型,147,????,1
|
||||
61,相川涼,RYO AIKAWA,3,5月6日,AB型,168,????,1
|
||||
62,イザベラ,ISABELLA,3,11月16日,B型,162,????,1
|
||||
63,エマ・ヴェルデ,EMMA VERDE,3,2月5日,O型,166,????,1
|
||||
64,高天原睦月,MUTSUKI TAKAMAGAHARA,1,1月25日,AB型,148,????,1
|
||||
65,ジェニファー,JENNIFER,2,5月12日,A型,165,????,1
|
||||
66,マリア,MARIA,1,8月6日,A型,163,????,1
|
||||
67,レオ,LEO,2,8月16日,AB型,151,????,1
|
||||
68,早乙女紫,YUKARI SAOTOME,1,3月3日,O型,158,????,1
|
||||
69,矢澤ここあ,COCOA YAZAWA,?,?月?日,?型,?,????,1
|
||||
70,矢澤虎太郎,COTARO YAZAWA,?,?月?日,?型,?,????,1
|
||||
71,矢澤こころ,COCORO YAZAWA,?,?月?日,?型,?,????,1
|
||||
72,ミカ,MIKA,2,?月?日,?型,?,????,1
|
||||
73,フミコ,FUMIKO,2,?月?日,?型,?,????,1
|
||||
74,ヒデコ,HIDEKO,2,?月?日,?型,?,????,1
|
||||
75,山田博子,HIROKO YAMADA,?,?月?日,?型,?,????,1
|
||||
76,にこの母,NICO'S MOTHER,?,?月?日,?型,?,????,1
|
||||
77,ことりの母,KOTORI'S MOTHER,?,?月?日,?型,?,????,1
|
||||
78,真姫の母,MAKI'S MOTHER,?,?月?日,?型,?,????,1
|
||||
79,穂乃果の母,HONOKA'S MOTHER,?,?月?日,?型,?,????,1
|
||||
80,綺羅ツバサ,TSUBASA KIRA,3,?月?日,?型,?,桜川めぐ,1
|
||||
81,優木あんじゅ,ANJU YUKI,3,?月?日,?型,?,大橋歩夕,1
|
||||
82,統堂英玲奈,ERENA TODO,3,?月?日,?型,?,松永真穂,1
|
||||
83,アルパカ[茶],alpaca,?,?月?日,?型,?,????,1
|
||||
84,μ's,μ's,?,?月?日,?型,?,????,1
|
||||
85,アルパカの子ども,alpaca's child,?,?月?日,?型,?,????,1
|
||||
86,絢瀬亜里沙,ALISA AYASE,?,?月?日,?型,?,????,1
|
||||
91,高坂穂乃果,HONOKA KOSAKA,?,8月3日,O型,?,新田恵海,1
|
||||
92,絢瀬絵里,ELI AYASE,?,10月21日,B型,?,南條愛乃,1
|
||||
93,南ことり,KOTORI MINAMI,?,9月12日,O型,?,内田 彩,1
|
||||
94,園田海未,UMI SONODA,?,3月15日,A型,?,三森すずこ,1
|
||||
95,星空凛,RIN HOSHIZORA,?,11月1日,A型,?,飯田里穂,1
|
||||
96,西木野真姫,MAKI NISHIKINO,?,4月19日,AB型,?,Pile,1
|
||||
97,東條希,NOZOMI TOJO,?,6月9日,O型,?,楠田亜衣奈,1
|
||||
98,小泉花陽,HANAYO KOIZUMI,?,1月17日,B型,?,久保ユリカ,1
|
||||
99,矢澤にこ,NICO YAZAWA,?,7月22日,A型,?,徳井青空,1
|
||||
101,高海千歌,CHIKA TAKAMI,2,8月1日,B型,157,伊波杏樹,1
|
||||
102,桜内梨子,RIKO SAKURAUCHI,2,9月19日,A型,160,逢田梨香子,1
|
||||
103,松浦果南,KANAN MATSUURA,3,2月10日,O型,162,諏訪ななか,1
|
||||
104,黒澤ダイヤ,DIA KUROSAWA,3,1月1日,A型,162,小宮有紗,1
|
||||
105,渡辺曜,YOU WATANABE,2,4月17日,AB型,157,斉藤朱夏,1
|
||||
106,津島善子,YOSHIKO TSUSHIMA,1,7月13日,O型,156,小林愛香,1
|
||||
107,国木田花丸,HANAMARU KUNIKIDA,1,3月4日,O型,152,高槻かなこ,1
|
||||
108,小原鞠莉,MARI OHARA,3,6月13日,AB型,163,鈴木愛奈,1
|
||||
109,黒澤ルビィ,RUBY KUROSAWA,1,9月21日,A型,154,降幡 愛,1
|
||||
110,Aqours,,?,?月?日,?型,?,????,1
|
||||
111,しいたけ,SHIITAKE,?,?月?日,?型,?,????,1
|
||||
112,鹿角理亞,LEAH KAZUNO,1,12月12日,AB型,153,佐藤日向,1
|
||||
113,鹿角聖良,SARAH KAZUNO,3,5月4日,A型,162,田野アサミ,1
|
||||
114,うちっちー,UCHICCHI,?,?月?日,?型,?,????,1
|
||||
115,千歌の母,CHIKA'S MOTHER,?,?月?日,?型,?,????,1
|
||||
116,佐藤洋子,YOKO SATO,?,?月?日,?型,?,????,1
|
||||
117,わたあめ,WATAAME,?,?月?日,?型,?,????,1
|
||||
118,よしみ,YOSHIMI,2,?月?日,?型,?,????,1
|
||||
119,いつき,ITSUKI,2,?月?日,?型,?,????,1
|
||||
120,むつ,MUTSU,2,?月?日,?型,?,????,1
|
||||
121,高海美渡,MITO TAKAMI,?,?月?日,?型,?,????,1
|
||||
122,高海志満,SHIMA TAKAMI,?,?月?日,?型,?,????,1
|
||||
123,梨子の母,RIKO'S MOTHER,?,?月?日,?型,?,????,1
|
||||
124,Aqours,Aqours,?,?月?日,?型,?,????,1
|
||||
125,しいたけの子ども,SHIITAKE'S CHILDREN,?,?月?日,?型,?,????,1
|
||||
126,あんこ,Anko,?,?月?日,?型,?,????,1
|
||||
127,ブロッサム,BLOSSOM,?,?月?日,?型,?,????,1
|
||||
128,バブルス,BUBBLES,?,?月?日,?型,?,????,1
|
||||
129,バターカップ,BUTTERCUP,?,?月?日,?型,?,????,1
|
||||
130,渡辺月,TSUKI WATANABE,?,?月?日,?型,?,????,1
|
||||
131,しんのすけ,SHINNOSUKE,?,?月?日,?型,?,????,1
|
||||
134,ひまわり,HIMAWARI,?,?月?日,?型,?,????,1
|
||||
135,シロ,SHIRO,?,?月?日,?型,?,????,1
|
||||
136,しんちゃん,SHINCHAN,?,?月?日,?型,?,????,1
|
||||
137,ボーちゃん,BO-CHAN,?,?月?日,?型,?,????,1
|
||||
138,風間くん,KAZAMA-KUN,?,?月?日,?型,?,????,1
|
||||
139,ネネちゃん,NENE-CHAN,?,?月?日,?型,?,????,1
|
||||
140,マサオくん,MASAO-KUN,?,?月?日,?型,?,????,1
|
||||
143,玲,LEI,?,?月?日,?型,?,????,1
|
||||
144,エリザベス,ELIZABETH,?,?月?日,?型,?,????,1
|
||||
145,マリー,MARIE,?,?月?日,?型,?,????,1
|
||||
146,マーガレット,MARGARET,?,?月?日,?型,?,????,1
|
||||
147,ひかり,HIKARI,?,?月?日,?型,?,????,1
|
||||
148,ナギ,NAGI,?,?月?日,?型,?,????,1
|
||||
149,エリザベス,ELIZABETH,?,?月?日,?型,?,????,1
|
||||
150,マーガレット,MARGARET,?,?月?日,?型,?,????,1
|
||||
151,ジュスティーヌ&カロリーヌ,JUSTINE & CAROLINE,?,?月?日,?型,?,????,1
|
||||
152,岳羽ゆかり,YUKARI TAKEBA,?,?月?日,?型,?,????,1
|
||||
153,桐条美鶴,MITSURU KIRIJO,?,?月?日,?型,?,????,1
|
||||
154,山岸風花,FUUKA YAMAGISHI,?,?月?日,?型,?,????,1
|
||||
155,アイギス,AEGIS,?,?月?日,?型,?,????,1
|
||||
156,汐見琴音,KOTONE SHIOMI,?,?月?日,?型,?,????,1
|
||||
157,里中千枝,CHIE SATONAKA,?,?月?日,?型,?,????,1
|
||||
158,天城雪子,YUKIKO AMAGI,?,?月?日,?型,?,????,1
|
||||
159,久慈川りせ,RISE KUJIKAWA,?,?月?日,?型,?,????,1
|
||||
160,白鐘直斗,NAOTO SHIROGANE,?,?月?日,?型,?,????,1
|
||||
161,マリー,MARIE,?,?月?日,?型,?,????,1
|
||||
162,パンサー,PANTHER,?,?月?日,?型,?,????,1
|
||||
163,クイーン,QUEEN,?,?月?日,?型,?,????,1
|
||||
164,ナビ,ORACLE,?,?月?日,?型,?,????,1
|
||||
165,ノワール,NOIR,?,?月?日,?型,?,????,1
|
||||
166,ヴァイオレット,VIOLET,?,?月?日,?型,?,????,1
|
||||
167,エリザベス,ELIZABETH,?,?月?日,?型,?,????,1
|
||||
168,カレン,Kallen,?,?月?日,?型,?,????,1
|
||||
169,シャーリー,Shirley,?,?月?日,?型,?,????,1
|
||||
170,C.C.,C.C.,?,?月?日,?型,?,????,1
|
||||
171,コーネリア,Cornelia,?,?月?日,?型,?,????,1
|
||||
172,ユーフェミア,Euphemia,?,?月?日,?型,?,????,1
|
||||
173,ナナリー,Nunnally,?,?月?日,?型,?,????,1
|
||||
174,ヴィレッタ,Villetta,?,?月?日,?型,?,????,1
|
||||
175,咲世子,Sayoko,?,?月?日,?型,?,????,1
|
||||
176,アーニャ,Anya,?,?月?日,?型,?,????,1
|
||||
191,高海千歌,CHIKA TAKAMI,?,8月1日,B型,?,伊波杏樹,1
|
||||
192,桜内梨子,RIKO SAKURAUCHI,?,9月19日,A型,?,逢田梨香子,1
|
||||
193,松浦果南,KANAN MATSUURA,?,2月10日,O型,?,諏訪ななか,1
|
||||
194,黒澤ダイヤ,DIA KUROSAWA,?,1月1日,A型,?,小宮有紗,1
|
||||
195,渡辺曜,YOU WATANABE,?,4月17日,AB型,?,斉藤朱夏,1
|
||||
196,津島善子,YOSHIKO TSUSHIMA,?,7月13日,O型,?,小林愛香,1
|
||||
197,国木田花丸,HANAMARU KUNIKIDA,?,3月4日,O型,?,高槻かなこ,1
|
||||
198,小原鞠莉,MARI OHARA,?,6月13日,AB型,?,鈴木愛奈,1
|
||||
199,黒澤ルビィ,RUBY KUROSAWA,?,9月21日,A型,?,降幡 愛,1
|
||||
201,上原歩夢,AYUMU UEHARA,2,3月1日,A型,159,大西亜玖璃,1
|
||||
202,中須かすみ,KASUMI NAKASU,1,1月23日,B型,155,相良茉優,1
|
||||
203,桜坂しずく,SHIZUKU OSAKA,1,4月3日,A型,157,前田佳織里,1
|
||||
204,朝香果林,KARIN ASAKA,3,6月29日,AB型,167,久保田未夢,1
|
||||
205,宮下愛,AI MIYASHITA,2,5月30日,A型,163,村上奈津実,1
|
||||
206,近江彼方,KANATA KONOE,3,12月16日,O型,158,鬼頭明里,1
|
||||
207,優木せつ菜,SETSUNA YUKI,2,8月8日,O型,154,林 鼓子,1
|
||||
208,エマ・ヴェルデ,EMMA VERDE,3,2月5日,O型,166,指出毬亜,1
|
||||
209,天王寺璃奈,RINA TENNOJI,1,11月13日,B型,149,田中ちえ美,1
|
||||
210,川本美里,MISATO KAWAMOTO,?,?月?日,?型,?,????,1
|
||||
211,夏川マイ,MAI NATSUKAWA,?,?月?日,?型,?,????,1
|
||||
212,三船栞子,SHIORIKO MIFUNE,1,10月5日,AB型,160,小泉萌香,1
|
||||
213,ショウ・ランジュ,LANZHU ZHONG,2,2月15日,B型,165,法元明菜,1
|
||||
214,ミア・テイラー,MIA TAYLOR,3,12月6日,AB型,156,内田 秀,1
|
||||
301,澁谷かのん,KANON SHIBUYA,1,5月1日,A型,159,伊達さゆり,1
|
||||
302,唐可可,KEKE TANG,1,7月17日,O型,159,Liyuu,1
|
||||
303,嵐千砂都,CHISATO ARASHI,1,2月25日,B型,155,岬 なこ,1
|
||||
304,平安名すみれ,SUMIRE HEANNA,1,9月28日,AB型,161,ペイトン尚未,1
|
||||
305,葉月恋,REN HAZUKI,1,11月24日,A型,163,青山なぎさ,1
|
||||
306,桜小路きな子,Kinako Sakurakoji,1,4月10日,O型,159,鈴原希実,1
|
||||
307,米女メイ,Mei Yoneme,1,10月29日,A型,155,薮島朱音,1
|
||||
308,若菜四季,Shiki Wakana,1,6月17日,B型,161,大熊和奏,1
|
||||
309,鬼塚夏美,Natsumi Onitsuka,1,8月7日,AB型,152,絵森 彩,1
|
||||
311,聖澤悠奈,Yuuna Hijirisawa,?,?月?日,?型,?,吉武千颯,1
|
||||
312,柊摩央,Mao Hiiragi,?,?月?日,?型,?,結木ゆな,1
|
||||
313,さや,Saya,?,?月?日,?型,?,????,1
|
||||
314,ナナミ,Nanami,?,?月?日,?型,?,????,1
|
||||
315,ヤエ,Yae,?,?月?日,?型,?,????,1
|
||||
316,ココノ,Kokono,?,?月?日,?型,?,????,1
|
||||
317,理事長,Director,?,?月?日,?型,?,????,1
|
||||
318,澁谷ありあ,Aria Shibuya,?,?月?日,?型,?,????,1
|
||||
319,かのんの母,Kanon's mother,?,?月?日,?型,?,????,1
|
||||
320,マンマル,Manmaru,?,?月?日,?型,?,????,1
|
||||
321,チビ,Chibi,?,?月?日,?型,?,????,1
|
||||
501,C.C.,C.C.,?,?月?日,?型,?,????,1
|
||||
502,アーニャ,Anya,?,?月?日,?型,?,????,1
|
||||
503,ヴィレッタ,Villetta,?,?月?日,?型,?,????,1
|
||||
504,カレン,Kallen,?,?月?日,?型,?,????,1
|
||||
505,コーネリア,Cornelia,?,?月?日,?型,?,????,1
|
||||
506,シャーリー,Shirley,?,?月?日,?型,?,????,1
|
||||
507,セシル,Cecile,?,?月?日,?型,?,????,1
|
||||
508,ナナリー,Nunnally,?,?月?日,?型,?,????,1
|
||||
509,ニーナ,Nina,?,?月?日,?型,?,????,1
|
||||
510,ノネット,Nonette,?,?月?日,?型,?,????,1
|
||||
511,マリアンヌ,Marianne,?,?月?日,?型,?,????,1
|
||||
512,ミレイ,Milly,?,?月?日,?型,?,????,1
|
||||
513,モニカ,Monica,?,?月?日,?型,?,????,1
|
||||
514,ユーフェミア,Euphemia,?,?月?日,?型,?,????,1
|
||||
515,ラクシャータ,Rakshata,?,?月?日,?型,?,????,1
|
||||
516,ローマイヤ,Lohmeyer,?,?月?日,?型,?,????,1
|
||||
517,咲世子,Sayoko,?,?月?日,?型,?,????,1
|
||||
518,周香凛,Zhou Xianglin,?,?月?日,?型,?,????,1
|
||||
519,神楽那,Kaguya,?,?月?日,?型,?,????,1
|
||||
520,千葉凪沙,Nagisa Chiba,?,?月?日,?型,?,????,1
|
||||
521,天子,Emperor,?,?月?日,?型,?,????,1
|
||||
522,シャムナ,Shamuna,?,?月?日,?型,?,????,1
|
||||
901,高坂穂乃果,HONOKA KOSAKA,?,8月3日,O型,?,新田恵海,1
|
||||
902,絢瀬絵里,ELI AYASE,?,10月21日,B型,?,南條愛乃,1
|
||||
903,南ことり,KOTORI MINAMI,?,9月12日,O型,?,内田 彩,1
|
||||
904,園田海未,UMI SONODA,?,3月15日,A型,?,三森すずこ,1
|
||||
905,星空凛,RIN HOSHIZORA,?,11月1日,A型,?,飯田里穂,1
|
||||
906,西木野真姫,MAKI NISHIKINO,?,4月19日,AB型,?,Pile,1
|
||||
907,東條希,NOZOMI TOJO,?,6月9日,O型,?,楠田亜衣奈,1
|
||||
908,小泉花陽,HANAYO KOIZUMI,?,1月17日,B型,?,久保ユリカ,1
|
||||
909,矢澤にこ,NICO YAZAWA,?,7月22日,A型,?,徳井青空,1
|
||||
911,高海千歌,CHIKA TAKAMI,?,8月1日,B型,?,伊波杏樹,1
|
||||
912,桜内梨子,RIKO SAKURAUCHI,?,9月19日,A型,?,逢田梨香子,1
|
||||
913,松浦果南,KANAN MATSUURA,?,2月10日,O型,?,諏訪ななか,1
|
||||
914,黒澤ダイヤ,DIA KUROSAWA,?,1月1日,A型,?,小宮有紗,1
|
||||
915,渡辺曜,YOU WATANABE,?,4月17日,AB型,?,斉藤朱夏,1
|
||||
916,津島善子,YOSHIKO TSUSHIMA,?,7月13日,O型,?,小林愛香,1
|
||||
917,国木田花丸,HANAMARU KUNIKIDA,?,3月4日,O型,?,高槻かなこ,1
|
||||
918,小原鞠莉,MARI OHARA,?,6月13日,AB型,?,鈴木愛奈,1
|
||||
919,黒澤ルビィ,RUBY KUROSAWA,?,9月21日,A型,?,降幡 愛,1
|
||||
921,高坂穂乃果,HONOKA KOSAKA,?,8月3日,O型,?,新田恵海,1
|
||||
922,絢瀬絵里,ELI AYASE,?,10月21日,B型,?,南條愛乃,1
|
||||
923,南ことり,KOTORI MINAMI,?,9月12日,O型,?,内田 彩,1
|
||||
924,園田海未,UMI SONODA,?,3月15日,A型,?,三森すずこ,1
|
||||
925,星空凛,RIN HOSHIZORA,?,11月1日,A型,?,飯田里穂,1
|
||||
926,西木野真姫,MAKI NISHIKINO,?,4月19日,AB型,?,Pile,1
|
||||
927,東條希,NOZOMI TOJO,?,6月9日,O型,?,楠田亜衣奈,1
|
||||
928,小泉花陽,HANAYO KOIZUMI,?,1月17日,B型,?,久保ユリカ,1
|
||||
929,矢澤にこ,NICO YAZAWA,?,7月22日,A型,?,徳井青空,1
|
||||
931,高海千歌,CHIKA TAKAMI,?,8月1日,B型,?,伊波杏樹,1
|
||||
932,桜内梨子,RIKO SAKURAUCHI,?,9月19日,A型,?,逢田梨香子,1
|
||||
933,松浦果南,KANAN MATSUURA,?,2月10日,O型,?,諏訪ななか,1
|
||||
934,黒澤ダイヤ,DIA KUROSAWA,?,1月1日,A型,?,小宮有紗,1
|
||||
935,渡辺曜,YOU WATANABE,?,4月17日,AB型,?,斉藤朱夏,1
|
||||
936,津島善子,YOSHIKO TSUSHIMA,?,7月13日,O型,?,小林愛香,1
|
||||
937,国木田花丸,HANAMARU KUNIKIDA,?,3月4日,O型,?,高槻かなこ,1
|
||||
938,小原鞠莉,MARI OHARA,?,6月13日,AB型,?,鈴木愛奈,1
|
||||
939,黒澤ルビィ,RUBY KUROSAWA,?,9月21日,A型,?,降幡 愛,1
|
||||
940,高海千歌,CHIKA TAKAMI,?,8月1日,B型,?,伊波杏樹,1
|
||||
941,桜内梨子,RIKO SAKURAUCHI,?,9月19日,A型,?,逢田梨香子,1
|
||||
942,松浦果南,KANAN MATSUURA,?,2月10日,O型,?,諏訪ななか,1
|
||||
943,黒澤ダイヤ,DIA KUROSAWA,?,1月1日,A型,?,小宮有紗,1
|
||||
944,渡辺曜,YOU WATANABE,?,4月17日,AB型,?,斉藤朱夏,1
|
||||
945,津島善子,YOSHIKO TSUSHIMA,?,7月13日,O型,?,小林愛香,1
|
||||
946,国木田花丸,HANAMARU KUNIKIDA,?,3月4日,O型,?,高槻かなこ,1
|
||||
947,小原鞠莉,MARI OHARA,?,6月13日,AB型,?,鈴木愛奈,1
|
||||
948,黒澤ルビィ,RUBY KUROSAWA,?,9月21日,A型,?,降幡 愛,1
|
||||
949,高坂穂乃果,Honoka Kosaka,?,8月3日,O型,?,新田恵海,1
|
||||
950,絢瀬絵里,Eli Ayase,?,10月21日,B型,?,南條愛乃,1
|
||||
951,南ことり,Kotori Minami,?,9月12日,O型,?,内田 彩,1
|
||||
952,園田海未,Umi Sonoda,?,3月15日,A型,?,三森すずこ,1
|
||||
953,星空凛,Rin Hoshizora,?,11月1日,A型,?,飯田里穂,1
|
||||
954,西木野真姫,Maki Nishikino,?,4月19日,AB型,?,Pile,1
|
||||
955,東條希,Nozomi Tojo,?,6月9日,O型,?,楠田亜衣奈,1
|
||||
956,小泉花陽,Hanayo Koizumi,?,1月17日,B型,?,久保ユリカ,1
|
||||
957,矢澤にこ,Nico Yazawa,?,7月22日,A型,?,徳井青空,1
|
||||
|
658
src/router/databases/csv-en/album_unit_type_member_tag_m.csv
Normal file
658
src/router/databases/csv-en/album_unit_type_member_tag_m.csv
Normal file
@@ -0,0 +1,658 @@
|
||||
_unitTypeId,_memberTagId,_masterReleaseLabelId
|
||||
1,4,1
|
||||
1,6,1
|
||||
1,14,1
|
||||
1,23,1
|
||||
1,32,1
|
||||
1,37,1
|
||||
1,71,1
|
||||
1,72,1
|
||||
1,73,1
|
||||
1,74,1
|
||||
1,75,1
|
||||
1,76,1
|
||||
1,77,1
|
||||
1,78,1
|
||||
1,145,1
|
||||
2,4,1
|
||||
2,8,1
|
||||
2,22,1
|
||||
2,29,1
|
||||
2,30,1
|
||||
2,31,1
|
||||
2,36,1
|
||||
2,39,1
|
||||
2,71,1
|
||||
2,79,1
|
||||
2,80,1
|
||||
2,81,1
|
||||
2,82,1
|
||||
2,83,1
|
||||
2,84,1
|
||||
2,85,1
|
||||
2,145,1
|
||||
3,4,1
|
||||
3,6,1
|
||||
3,17,1
|
||||
3,25,1
|
||||
3,26,1
|
||||
3,32,1
|
||||
3,37,1
|
||||
3,72,1
|
||||
3,79,1
|
||||
3,86,1
|
||||
3,87,1
|
||||
3,88,1
|
||||
3,89,1
|
||||
3,90,1
|
||||
3,91,1
|
||||
3,145,1
|
||||
4,4,1
|
||||
4,7,1
|
||||
4,19,1
|
||||
4,26,1
|
||||
4,29,1
|
||||
4,31,1
|
||||
4,32,1
|
||||
4,37,1
|
||||
4,73,1
|
||||
4,80,1
|
||||
4,86,1
|
||||
4,92,1
|
||||
4,93,1
|
||||
4,94,1
|
||||
4,95,1
|
||||
4,96,1
|
||||
4,145,1
|
||||
5,4,1
|
||||
5,1,1
|
||||
5,7,1
|
||||
5,20,1
|
||||
5,23,1
|
||||
5,27,1
|
||||
5,33,1
|
||||
5,35,1
|
||||
5,37,1
|
||||
5,39,1
|
||||
5,74,1
|
||||
5,81,1
|
||||
5,87,1
|
||||
5,92,1
|
||||
5,97,1
|
||||
5,98,1
|
||||
5,99,1
|
||||
5,100,1
|
||||
5,145,1
|
||||
6,4,1
|
||||
6,1,1
|
||||
6,8,1
|
||||
6,18,1
|
||||
6,27,1
|
||||
6,28,1
|
||||
6,31,1
|
||||
6,35,1
|
||||
6,37,1
|
||||
6,39,1
|
||||
6,75,1
|
||||
6,82,1
|
||||
6,88,1
|
||||
6,93,1
|
||||
6,97,1
|
||||
6,101,1
|
||||
6,102,1
|
||||
6,103,1
|
||||
6,145,1
|
||||
7,4,1
|
||||
7,7,1
|
||||
7,21,1
|
||||
7,24,1
|
||||
7,30,1
|
||||
7,36,1
|
||||
7,39,1
|
||||
7,76,1
|
||||
7,83,1
|
||||
7,89,1
|
||||
7,94,1
|
||||
7,98,1
|
||||
7,101,1
|
||||
7,104,1
|
||||
7,105,1
|
||||
7,145,1
|
||||
8,4,1
|
||||
8,1,1
|
||||
8,6,1
|
||||
8,15,1
|
||||
8,25,1
|
||||
8,33,1
|
||||
8,35,1
|
||||
8,37,1
|
||||
8,39,1
|
||||
8,77,1
|
||||
8,84,1
|
||||
8,90,1
|
||||
8,95,1
|
||||
8,99,1
|
||||
8,102,1
|
||||
8,104,1
|
||||
8,106,1
|
||||
8,145,1
|
||||
9,4,1
|
||||
9,8,1
|
||||
9,16,1
|
||||
9,24,1
|
||||
9,28,1
|
||||
9,33,1
|
||||
9,36,1
|
||||
9,37,1
|
||||
9,39,1
|
||||
9,78,1
|
||||
9,85,1
|
||||
9,91,1
|
||||
9,96,1
|
||||
9,100,1
|
||||
9,103,1
|
||||
9,105,1
|
||||
9,106,1
|
||||
9,145,1
|
||||
10,52,1
|
||||
11,50,1
|
||||
11,1,1
|
||||
12,50,1
|
||||
12,1,1
|
||||
13,50,1
|
||||
13,1,1
|
||||
14,50,1
|
||||
15,50,1
|
||||
16,50,1
|
||||
17,50,1
|
||||
18,50,1
|
||||
19,50,1
|
||||
20,50,1
|
||||
20,1,1
|
||||
21,50,1
|
||||
21,1,1
|
||||
22,50,1
|
||||
22,1,1
|
||||
23,50,1
|
||||
24,50,1
|
||||
25,50,1
|
||||
26,50,1
|
||||
27,50,1
|
||||
28,50,1
|
||||
29,50,1
|
||||
29,1,1
|
||||
30,50,1
|
||||
30,1,1
|
||||
31,50,1
|
||||
31,1,1
|
||||
32,50,1
|
||||
33,50,1
|
||||
34,50,1
|
||||
35,50,1
|
||||
36,50,1
|
||||
37,50,1
|
||||
38,52,1
|
||||
39,52,1
|
||||
40,52,1
|
||||
41,50,1
|
||||
42,50,1
|
||||
42,1,1
|
||||
43,50,1
|
||||
44,52,1
|
||||
45,50,1
|
||||
46,50,1
|
||||
46,1,1
|
||||
47,50,1
|
||||
47,1,1
|
||||
48,50,1
|
||||
49,50,1
|
||||
50,50,1
|
||||
51,50,1
|
||||
52,50,1
|
||||
53,50,1
|
||||
54,50,1
|
||||
54,1,1
|
||||
55,50,1
|
||||
56,50,1
|
||||
57,50,1
|
||||
58,50,1
|
||||
58,1,1
|
||||
59,50,1
|
||||
60,50,1
|
||||
60,1,1
|
||||
61,50,1
|
||||
62,50,1
|
||||
63,50,1
|
||||
64,50,1
|
||||
64,1,1
|
||||
65,50,1
|
||||
66,50,1
|
||||
66,1,1
|
||||
67,50,1
|
||||
68,50,1
|
||||
68,1,1
|
||||
69,52,1
|
||||
70,52,1
|
||||
71,52,1
|
||||
72,52,1
|
||||
73,52,1
|
||||
74,52,1
|
||||
75,52,1
|
||||
76,52,1
|
||||
77,52,1
|
||||
78,52,1
|
||||
79,52,1
|
||||
80,12,1
|
||||
80,51,1
|
||||
81,12,1
|
||||
81,51,1
|
||||
82,12,1
|
||||
82,51,1
|
||||
83,52,1
|
||||
85,52,1
|
||||
86,52,1
|
||||
91,14,1
|
||||
92,22,1
|
||||
93,17,1
|
||||
94,19,1
|
||||
95,20,1
|
||||
96,18,1
|
||||
97,21,1
|
||||
98,15,1
|
||||
99,16,1
|
||||
101,5,1
|
||||
101,9,1
|
||||
101,34,1
|
||||
101,41,1
|
||||
101,107,1
|
||||
101,108,1
|
||||
101,109,1
|
||||
101,110,1
|
||||
101,111,1
|
||||
101,112,1
|
||||
101,113,1
|
||||
101,114,1
|
||||
101,56,1
|
||||
101,57,1
|
||||
101,58,1
|
||||
101,147,1
|
||||
101,151,1
|
||||
102,5,1
|
||||
102,11,1
|
||||
102,34,1
|
||||
102,42,1
|
||||
102,107,1
|
||||
102,115,1
|
||||
102,116,1
|
||||
102,117,1
|
||||
102,118,1
|
||||
102,119,1
|
||||
102,120,1
|
||||
102,121,1
|
||||
102,53,1
|
||||
102,57,1
|
||||
102,58,1
|
||||
102,147,1
|
||||
102,148,1
|
||||
103,5,1
|
||||
103,10,1
|
||||
103,40,1
|
||||
103,43,1
|
||||
103,108,1
|
||||
103,115,1
|
||||
103,122,1
|
||||
103,123,1
|
||||
103,124,1
|
||||
103,125,1
|
||||
103,126,1
|
||||
103,127,1
|
||||
103,56,1
|
||||
103,57,1
|
||||
103,58,1
|
||||
103,147,1
|
||||
103,149,1
|
||||
104,5,1
|
||||
104,10,1
|
||||
104,40,1
|
||||
104,44,1
|
||||
104,109,1
|
||||
104,116,1
|
||||
104,122,1
|
||||
104,128,1
|
||||
104,129,1
|
||||
104,130,1
|
||||
104,131,1
|
||||
104,132,1
|
||||
104,54,1
|
||||
104,57,1
|
||||
104,58,1
|
||||
104,147,1
|
||||
104,151,1
|
||||
105,5,1
|
||||
105,9,1
|
||||
105,34,1
|
||||
105,45,1
|
||||
105,110,1
|
||||
105,117,1
|
||||
105,123,1
|
||||
105,128,1
|
||||
105,133,1
|
||||
105,134,1
|
||||
105,135,1
|
||||
105,136,1
|
||||
105,55,1
|
||||
105,57,1
|
||||
105,58,1
|
||||
105,147,1
|
||||
105,148,1
|
||||
106,5,1
|
||||
106,1,1
|
||||
106,11,1
|
||||
106,38,1
|
||||
106,46,1
|
||||
106,111,1
|
||||
106,118,1
|
||||
106,124,1
|
||||
106,129,1
|
||||
106,133,1
|
||||
106,137,1
|
||||
106,138,1
|
||||
106,139,1
|
||||
106,55,1
|
||||
106,57,1
|
||||
106,58,1
|
||||
106,70,1
|
||||
106,147,1
|
||||
106,151,1
|
||||
107,5,1
|
||||
107,1,1
|
||||
107,10,1
|
||||
107,38,1
|
||||
107,47,1
|
||||
107,112,1
|
||||
107,119,1
|
||||
107,125,1
|
||||
107,130,1
|
||||
107,134,1
|
||||
107,137,1
|
||||
107,140,1
|
||||
107,141,1
|
||||
107,53,1
|
||||
107,57,1
|
||||
107,58,1
|
||||
107,147,1
|
||||
107,150,1
|
||||
108,5,1
|
||||
108,11,1
|
||||
108,40,1
|
||||
108,48,1
|
||||
108,113,1
|
||||
108,120,1
|
||||
108,126,1
|
||||
108,131,1
|
||||
108,135,1
|
||||
108,138,1
|
||||
108,140,1
|
||||
108,142,1
|
||||
108,53,1
|
||||
108,57,1
|
||||
108,58,1
|
||||
108,147,1
|
||||
108,149,1
|
||||
109,5,1
|
||||
109,1,1
|
||||
109,9,1
|
||||
109,38,1
|
||||
109,49,1
|
||||
109,114,1
|
||||
109,121,1
|
||||
109,127,1
|
||||
109,132,1
|
||||
109,136,1
|
||||
109,139,1
|
||||
109,141,1
|
||||
109,142,1
|
||||
109,54,1
|
||||
109,57,1
|
||||
109,58,1
|
||||
109,147,1
|
||||
109,150,1
|
||||
110,52,1
|
||||
111,52,1
|
||||
112,51,1
|
||||
112,13,1
|
||||
112,57,1
|
||||
113,51,1
|
||||
113,13,1
|
||||
113,57,1
|
||||
114,52,1
|
||||
115,52,1
|
||||
116,52,1
|
||||
117,52,1
|
||||
118,52,1
|
||||
119,52,1
|
||||
120,52,1
|
||||
121,52,1
|
||||
122,52,1
|
||||
123,52,1
|
||||
125,52,1
|
||||
126,52,1
|
||||
127,52,1
|
||||
128,52,1
|
||||
129,52,1
|
||||
130,52,1
|
||||
131,52,1
|
||||
131,144,1
|
||||
134,52,1
|
||||
134,144,1
|
||||
135,52,1
|
||||
135,144,1
|
||||
136,52,1
|
||||
136,144,1
|
||||
137,52,1
|
||||
137,144,1
|
||||
138,52,1
|
||||
138,144,1
|
||||
139,52,1
|
||||
139,144,1
|
||||
140,52,1
|
||||
140,144,1
|
||||
143,145,1
|
||||
144,145,1
|
||||
145,145,1
|
||||
146,145,1
|
||||
147,145,1
|
||||
148,145,1
|
||||
149,145,1
|
||||
150,145,1
|
||||
151,145,1
|
||||
152,145,1
|
||||
153,145,1
|
||||
154,145,1
|
||||
155,145,1
|
||||
156,145,1
|
||||
157,145,1
|
||||
158,145,1
|
||||
159,145,1
|
||||
160,145,1
|
||||
161,145,1
|
||||
162,145,1
|
||||
163,145,1
|
||||
164,145,1
|
||||
165,145,1
|
||||
166,145,1
|
||||
167,145,1
|
||||
168,147,1
|
||||
169,147,1
|
||||
170,147,1
|
||||
171,147,1
|
||||
172,147,1
|
||||
173,147,1
|
||||
174,147,1
|
||||
175,147,1
|
||||
176,147,1
|
||||
191,41,1
|
||||
192,42,1
|
||||
193,43,1
|
||||
194,44,1
|
||||
195,45,1
|
||||
196,46,1
|
||||
197,47,1
|
||||
198,48,1
|
||||
199,49,1
|
||||
201,60,1
|
||||
201,61,1
|
||||
201,1001,1
|
||||
202,60,1
|
||||
202,1,1
|
||||
202,62,1
|
||||
202,1002,1
|
||||
203,60,1
|
||||
203,1,1
|
||||
203,63,1
|
||||
203,1001,1
|
||||
204,60,1
|
||||
204,64,1
|
||||
204,1000,1
|
||||
205,60,1
|
||||
205,65,1
|
||||
205,1000,1
|
||||
206,60,1
|
||||
206,66,1
|
||||
206,1002,1
|
||||
207,60,1
|
||||
207,67,1
|
||||
207,1001,1
|
||||
208,60,1
|
||||
208,68,1
|
||||
208,1002,1
|
||||
209,60,1
|
||||
209,1,1
|
||||
209,69,1
|
||||
209,1002,1
|
||||
210,52,1
|
||||
211,52,1
|
||||
212,60,1
|
||||
212,1,1
|
||||
212,2000,1
|
||||
213,60,1
|
||||
213,2002,1
|
||||
214,60,1
|
||||
214,2001,1
|
||||
301,143,1
|
||||
301,1,1
|
||||
301,3000,1
|
||||
302,143,1
|
||||
302,1,1
|
||||
302,3001,1
|
||||
303,143,1
|
||||
303,1,1
|
||||
303,3002,1
|
||||
304,143,1
|
||||
304,1,1
|
||||
304,3003,1
|
||||
305,143,1
|
||||
305,1,1
|
||||
305,3004,1
|
||||
306,143,1
|
||||
306,1,1
|
||||
306,3005,1
|
||||
307,143,1
|
||||
307,1,1
|
||||
307,3006,1
|
||||
308,143,1
|
||||
308,1,1
|
||||
308,3007,1
|
||||
309,143,1
|
||||
309,1,1
|
||||
309,3008,1
|
||||
311,146,1
|
||||
311,51,1
|
||||
312,146,1
|
||||
312,51,1
|
||||
313,52,1
|
||||
314,52,1
|
||||
315,52,1
|
||||
316,52,1
|
||||
317,52,1
|
||||
318,52,1
|
||||
319,52,1
|
||||
320,52,1
|
||||
321,52,1
|
||||
901,14,1
|
||||
902,22,1
|
||||
903,17,1
|
||||
904,19,1
|
||||
905,20,1
|
||||
906,18,1
|
||||
907,21,1
|
||||
908,15,1
|
||||
909,16,1
|
||||
911,41,1
|
||||
912,42,1
|
||||
913,43,1
|
||||
914,44,1
|
||||
915,45,1
|
||||
916,46,1
|
||||
917,47,1
|
||||
918,48,1
|
||||
919,49,1
|
||||
921,14,1
|
||||
921,144,1
|
||||
922,22,1
|
||||
922,144,1
|
||||
923,17,1
|
||||
923,144,1
|
||||
924,19,1
|
||||
924,144,1
|
||||
925,20,1
|
||||
925,144,1
|
||||
926,18,1
|
||||
926,144,1
|
||||
927,21,1
|
||||
927,144,1
|
||||
928,15,1
|
||||
928,144,1
|
||||
929,16,1
|
||||
929,144,1
|
||||
931,41,1
|
||||
931,144,1
|
||||
932,42,1
|
||||
932,144,1
|
||||
933,43,1
|
||||
933,144,1
|
||||
934,44,1
|
||||
934,144,1
|
||||
935,45,1
|
||||
935,144,1
|
||||
936,46,1
|
||||
936,144,1
|
||||
937,47,1
|
||||
937,144,1
|
||||
938,48,1
|
||||
938,144,1
|
||||
939,49,1
|
||||
939,144,1
|
||||
940,145,1
|
||||
941,145,1
|
||||
942,145,1
|
||||
943,145,1
|
||||
944,145,1
|
||||
945,145,1
|
||||
946,145,1
|
||||
947,145,1
|
||||
948,145,1
|
||||
949,147,1
|
||||
950,147,1
|
||||
951,147,1
|
||||
952,147,1
|
||||
953,147,1
|
||||
954,147,1
|
||||
955,147,1
|
||||
956,147,1
|
||||
957,147,1
|
||||
10301,143,1
|
||||
10302,143,1
|
||||
10303,143,1
|
||||
10304,143,1
|
||||
10305,143,1
|
||||
|
28
src/router/databases/csv-en/beginner_mission.csv
Normal file
28
src/router/databases/csv-en/beginner_mission.csv
Normal file
@@ -0,0 +1,28 @@
|
||||
_id,_level,_number,_masterMissionId,_masterReleaseLabelId
|
||||
1,1,1,1653001,1
|
||||
1,1,2,1605001,1
|
||||
1,1,3,1662001,1
|
||||
1,1,4,1663001,1
|
||||
1,1,5,1660001,1
|
||||
1,1,6,1614001,1
|
||||
1,1,7,1666001,1
|
||||
1,1,8,1658001,1
|
||||
1,1,9,1661001,1
|
||||
1,2,1,1653002,1
|
||||
1,2,2,1605002,1
|
||||
1,2,3,1665001,1
|
||||
1,2,4,1664001,1
|
||||
1,2,5,1658002,1
|
||||
1,2,6,1630001,1
|
||||
1,2,7,1606001,1
|
||||
1,2,8,1614002,1
|
||||
1,2,9,1663002,1
|
||||
1,3,1,1653003,1
|
||||
1,3,2,1605003,1
|
||||
1,3,3,1660002,1
|
||||
1,3,4,1617001,1
|
||||
1,3,5,1658003,1
|
||||
1,3,6,1625001,1
|
||||
1,3,7,1614003,1
|
||||
1,3,8,1664002,1
|
||||
1,3,9,1626001,1
|
||||
|
29
src/router/databases/csv-en/beginner_mission_reward.csv
Normal file
29
src/router/databases/csv-en/beginner_mission_reward.csv
Normal file
@@ -0,0 +1,29 @@
|
||||
_id,_number,_type,_giveType,_value,_level,_amount,_masterReleaseLabelId
|
||||
270000001,1,1,2,1,0,500,1
|
||||
270000002,1,1,2,1,0,50,1
|
||||
270000003,1,1,2,1,0,50,1
|
||||
270000004,1,1,2,1,0,50,1
|
||||
270000005,1,1,2,1,0,50,1
|
||||
270000006,1,1,2,1,0,50,1
|
||||
270000007,1,1,2,1,0,50,1
|
||||
270000008,1,1,2,1,0,100,1
|
||||
270000009,1,1,2,1,0,100,1
|
||||
270000010,1,1,2,1,0,500,1
|
||||
270000011,1,1,2,1,0,50,1
|
||||
270000012,1,1,2,1,0,50,1
|
||||
270000013,1,1,2,1,0,50,1
|
||||
270000014,1,1,2,1,0,50,1
|
||||
270000015,1,1,2,1,0,50,1
|
||||
270000016,1,1,2,1,0,50,1
|
||||
270000017,1,1,2,1,0,100,1
|
||||
270000018,1,1,2,1,0,100,1
|
||||
270000019,1,1,2,1,0,500,1
|
||||
270000020,1,1,2,1,0,50,1
|
||||
270000021,1,1,2,1,0,50,1
|
||||
270000022,1,1,2,1,0,50,1
|
||||
270000023,1,1,2,1,0,50,1
|
||||
270000024,1,1,2,1,0,50,1
|
||||
270000025,1,1,2,1,0,50,1
|
||||
270000026,1,1,2,1,0,100,1
|
||||
270000027,1,1,2,1,0,100,1
|
||||
270000999,1,3,1,15010004,0,1,1
|
||||
|
@@ -0,0 +1,28 @@
|
||||
_masterBeginnerMissionId,_level,_number,_masterBeginnerMissionRewardId,_masterReleaseLabelId
|
||||
1,1,0,270000001,1
|
||||
1,1,1,270000002,1
|
||||
1,1,2,270000003,1
|
||||
1,1,3,270000004,1
|
||||
1,1,4,270000005,1
|
||||
1,1,5,270000006,1
|
||||
1,1,6,270000007,1
|
||||
1,1,7,270000008,1
|
||||
1,1,8,270000009,1
|
||||
1,2,0,270000010,1
|
||||
1,2,1,270000011,1
|
||||
1,2,2,270000012,1
|
||||
1,2,3,270000013,1
|
||||
1,2,4,270000014,1
|
||||
1,2,5,270000015,1
|
||||
1,2,6,270000016,1
|
||||
1,2,7,270000017,1
|
||||
1,2,8,270000018,1
|
||||
1,3,0,270000019,1
|
||||
1,3,1,270000020,1
|
||||
1,3,2,270000021,1
|
||||
1,3,3,270000022,1
|
||||
1,3,4,270000023,1
|
||||
1,3,5,270000024,1
|
||||
1,3,6,270000025,1
|
||||
1,3,7,270000026,1
|
||||
1,3,8,270000027,1
|
||||
|
1300
src/router/databases/csv-en/bgm.csv
Normal file
1300
src/router/databases/csv-en/bgm.csv
Normal file
File diff suppressed because it is too large
Load Diff
23
src/router/databases/csv-en/billing_product.csv
Normal file
23
src/router/databases/csv-en/billing_product.csv
Normal file
@@ -0,0 +1,23 @@
|
||||
_id,_masterBillingShopId,_itemName,_itemDetail,_type,_detail,_masterBillingProductRewardId,_startdashTime,_startdashExpireTime,_priority,_spriteName,_masterReleaseLabelId
|
||||
com.bushiroad.global.lovelive.sif2.apple.gempromo.4199,1010001,"6,000 Love Gems","Paid Love Gems x6,000",1,"6,000 Love Gems",0,0,0,70,shop_btn_muse_2,1
|
||||
com.bushiroad.global.lovelive.sif2.apple.gempromo.8499,1010001,"13,000 Love Gems","Paid Love Gems x13,000",1,"13,000 Love Gems",0,0,0,75,shop_btn_liella_2,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gempromo.4199,1010001,"6,000 Love Gems","Paid Love Gems x6,000",1,"6,000 Love Gems",0,0,0,70,shop_btn_muse_2,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gempromo.8499,1010001,"13,000 Love Gems","Paid Love Gems x13,000",1,"13,000 Love Gems",0,0,0,75,shop_btn_liella_2,1
|
||||
com.bushiroad.global.lovelive.sif2.gem.299,1010001,140 Love Gems,Paid Love Gems x140,1,140 Love Gems,0,0,0,40,shop_btn_nijigaku_1,1
|
||||
com.bushiroad.global.lovelive.sif2.gem.499,1010001,430 Love Gems,Paid Love Gems x420<br><size=22><color=#F93981>+Free Love Gems x10</size></color>,1,430 Love Gems,0,0,0,35,shop_btn_muse_1,1
|
||||
com.bushiroad.global.lovelive.sif2.gem.899,1010001,910 Love Gems,Paid Love Gems x870<br><size=22><color=#F93981>+Free Love Gems x40</size></color>,1,910 Love Gems,0,0,0,30,shop_btn_aqours_1,1
|
||||
com.bushiroad.global.lovelive.sif2.gem.1299,1010001,"1,380 Love Gems","Paid Love Gems x1,310<br><size=22><color=#F93981>+Free Love Gems x70</size></color>",1,"1,380 Love Gems",0,0,0,25,shop_btn_liella_1,1
|
||||
com.bushiroad.global.lovelive.sif2.gem.2499,1010001,"2,700 Love Gems","Paid Love Gems x2,530<br><size=22><color=#F93981>+Free Love Gems x170</size></color>",1,"2,700 Love Gems",0,0,0,20,shop_btn_nijigaku_2,1
|
||||
com.bushiroad.global.lovelive.sif2.gem.4199,1010001,"4,800 Love Gems","Paid Love Gems x4,460<br><size=22><color=#F93981>+Free Love Gems x340</size></color>",1,"4,800 Love Gems",0,0,0,15,shop_btn_muse_2,1
|
||||
com.bushiroad.global.lovelive.sif2.gem.6499,1010001,"7,500 Love Gems","Paid Love Gems x6,730<br><size=22><color=#F93981>+Free Love Gems x770</size></color>",1,"7,500 Love Gems",0,0,0,10,shop_btn_aqours_2,1
|
||||
com.bushiroad.global.lovelive.sif2.gem.8499,1010001,"10,100 Love Gems","Paid Love Gems x8,910<br><size=22><color=#F93981>+Free Love Gems x1,190</size></color>",1,"10,100 Love Gems",0,0,0,5,shop_btn_liella_2,1
|
||||
com.bushiroad.global.lovelive.sif2.google.promo.8499,1010001,"13,000 Love Gems","Paid Love Gems x13,000",1,"13,000 Love Gems",0,0,0,75,shop_btn_liella_2,1
|
||||
com.bushiroad.global.lovelive.sif2.google.promo.4199,1010001,"6,000 Love Gems","Paid Love Gems x6,000",1,"6,000 Love Gems",0,0,0,70,shop_btn_muse_2,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gem.299,1010001,140 Love Gems,Paid Love Gems x140,1,140 Love Gems,0,0,0,40,shop_btn_nijigaku_1,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gem.499,1010001,430 Love Gems,Paid Love Gems x420<br><size=22><color=#F93981>+Free Love Gems x10</size></color>,1,430 Love Gems,0,0,0,35,shop_btn_muse_1,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gem.899,1010001,910 Love Gems,Paid Love Gems x870<br><size=22><color=#F93981>+Free Love Gems x40</size></color>,1,910 Love Gems,0,0,0,30,shop_btn_aqours_1,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gem.1299,1010001,"1,380 Love Gems","Paid Love Gems x1,310<br><size=22><color=#F93981>+Free Love Gems x70</size></color>",1,"1,380 Love Gems",0,0,0,25,shop_btn_liella_1,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gem.2499,1010001,"2,700 Love Gems","Paid Love Gems x2,530<br><size=22><color=#F93981>+Free Love Gems x170</size></color>",1,"2,700 Love Gems",0,0,0,20,shop_btn_nijigaku_2,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gem.4199,1010001,"4,800 Love Gems","Paid Love Gems x4,460<br><size=22><color=#F93981>+Free Love Gems x340</size></color>",1,"4,800 Love Gems",0,0,0,15,shop_btn_muse_2,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gem.6499,1010001,"7,500 Love Gems","Paid Love Gems x6,730<br><size=22><color=#F93981>+Free Love Gems x770</size></color>",1,"7,500 Love Gems",0,0,0,10,shop_btn_aqours_2,1
|
||||
com.bushiroad.global.lovelive.sif2.google.gem.8499,1010001,"10,100 Love Gems","Paid Love Gems x8,910<br><size=22><color=#F93981>+Free Love Gems x1,190</size></color>",1,"10,100 Love Gems",0,0,0,5,shop_btn_liella_2,1
|
||||
|
2
src/router/databases/csv-en/billing_product_reward.csv
Normal file
2
src/router/databases/csv-en/billing_product_reward.csv
Normal file
@@ -0,0 +1,2 @@
|
||||
_id,_number,_type,_giveType,_value,_level,_amount,_masterReleaseLabelId
|
||||
50100011,1,1,1,0,0,500,1
|
||||
|
4
src/router/databases/csv-en/billing_shop.csv
Normal file
4
src/router/databases/csv-en/billing_shop.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
_id,_tabName,_name,_priority,_shopType,_spriteName,_masterShopRewardId,_masterReleaseLabelId
|
||||
1010001,Shop,Love Gem Shop,10,1,shop_banner_gem,0,1
|
||||
4010001,LP Shop,LP Shop,10,4,shop_banner_gem,0,1
|
||||
3040001,Special Shop,Release Celebration Shop,99,3,shop_banner_paid,0,1
|
||||
|
13
src/router/databases/csv-en/billing_subscription.csv
Normal file
13
src/router/databases/csv-en/billing_subscription.csv
Normal file
File diff suppressed because one or more lines are too long
37
src/router/databases/csv-en/billing_subscription_reward.csv
Normal file
37
src/router/databases/csv-en/billing_subscription_reward.csv
Normal file
@@ -0,0 +1,37 @@
|
||||
_masterBillingSubscriptionLabel,_number,_subscriptionRewardType,_value,_masterReleaseLabelId
|
||||
subscription_01.980,1,1,20000,1
|
||||
subscription_01.980,2,2,1805001,1
|
||||
subscription_01.980,3,2,1805002,1
|
||||
subscription_01.980,4,2,1805003,1
|
||||
subscription_01.980,5,2,1805004,1
|
||||
subscription_01.980,6,2,1805005,1
|
||||
subscription_01.980,7,2,1805006,1
|
||||
subscription_01.980,8,2,1805007,1
|
||||
subscription_01.980,9,2,1805008,1
|
||||
subscription_01.980,10,2,1805009,1
|
||||
subscription_01.980,11,2,1805010,1
|
||||
subscription_01.980,12,2,1805011,1
|
||||
subscription_01.980,13,2,1805012,1
|
||||
subscription_01.980,14,2,1805013,1
|
||||
subscription_01.980,15,2,1805014,1
|
||||
subscription_01.980,16,2,1805015,1
|
||||
subscription_01.980,17,2,1805016,1
|
||||
subscription_01.980,18,2,1805017,1
|
||||
subscription_01.980,19,2,1805018,1
|
||||
subscription_01.980,20,2,1805019,1
|
||||
subscription_01.980,21,2,1805020,1
|
||||
subscription_01.980,22,2,1805021,223101513
|
||||
subscription_01.980,23,2,1805022,223101513
|
||||
subscription_01.980,24,2,1805023,223101513
|
||||
subscription_01.980,25,2,1805024,223101513
|
||||
subscription_01.980,26,2,1805025,223101513
|
||||
subscription_01.980,27,2,1805026,223101513
|
||||
subscription_01.980,28,2,1805027,223101513
|
||||
subscription_01.980,29,2,1805028,223101513
|
||||
subscription_01.980,30,2,1805029,223101513
|
||||
subscription_01.980,31,2,1805030,223101513
|
||||
subscription_01.980,32,2,1805031,223101513
|
||||
subscription_01.980,33,2,1805032,223101513
|
||||
subscription_01.980,34,2,1805033,223101513
|
||||
subscription_01.980,35,2,1805034,223101513
|
||||
subscription_01.980,36,2,1805035,223101513
|
||||
|
579
src/router/databases/csv-en/card.csv
Normal file
579
src/router/databases/csv-en/card.csv
Normal file
@@ -0,0 +1,579 @@
|
||||
_id,_masterCharacterId,_name,_type,_masterSkillCenterId,_masterSkillId,_rarity,_hp,_smile,_cool,_pure,_illustId,_evolveIllustId,_masterCardLevelId,_uniqueBackgroundFileName,_evolveUniqueBackgroundFileName,_getCategory,_masterCardSysVoiceId,_albumUnitMId,_priority,_masterReleaseLabelId
|
||||
10010001,1001,Originator,1,100001,10010001,1,2,3767,2968,3265,01001_0001_00,01001_0001_01,1,,,1,0,0,1,1
|
||||
10010002,1001,Full Speed Ahead!,2,200001,10010002,1,2,3102,2899,3999,01001_0002_00,01001_0002_01,1,,,1,0,0,1,1
|
||||
10010003,1001,Positive,3,300001,10010003,1,2,3235,3774,2991,01001_0003_00,01001_0003_01,1,,,1,0,0,1,1
|
||||
10010004,1001,Pep is Paramount,2,200001,10010004,1,2,3005,3085,3910,01001_0004_00,01001_0004_01,1,,,1,0,0,1,1
|
||||
10010005,1001,Prep for Practice!,3,300001,10010005,1,2,3130,3634,3236,01001_0005_00,01001_0005_01,1,,,1,0,0,1,1
|
||||
10010006,1001,Let's Sing Together,1,100001,10010006,1,2,3600,3113,3287,01001_0006_00,01001_0006_01,1,,,1,0,0,1,1
|
||||
10010007,1001,Goodnight Smiles,2,200001,10010007,1,2,3224,3035,3741,01001_0007_00,01001_0007_01,1,,,1,0,0,1,1
|
||||
10010008,1001,Out and About Smiles,1,100001,10010008,1,2,3720,3337,2943,01001_0008_00,01001_0008_01,1,,,1,0,0,1,1
|
||||
10010009,1001,Prepare to Be Smashed,3,300001,10010009,1,2,2992,4077,2931,01001_0009_00,01001_0009_01,1,,,1,0,0,1,1
|
||||
10010010,1001,Ear-to-Ear Smiles!,1,100002,10010010,2,3,4599,3417,3484,01001_0010_00,01001_0010_01,2,b_card_0001,b_card_0074,1,0,0,1,1
|
||||
10010011,1001,Hearts Aflame,2,200002,10010011,2,3,3344,3471,4685,01001_0011_00,01001_0011_01,2,b_adv_0022,b_card_0031,1,0,0,1,1
|
||||
10010012,1001,I'll Eat You Up!,3,300002,10010012,2,3,3665,4185,3650,01001_0012_00,01001_0012_01,2,b_card_0002,b_card_0039,1,0,0,1,1
|
||||
10010013,1001,Blossoms in Bloom,1,100005,10010013,3,4,4769,3962,4269,01001_0013_00,01001_0013_01,3,,,1,10010013,0,1,1
|
||||
10010014,1001,Rice Fruit?!,3,300003,10010014,3,4,4263,4693,4044,01001_0014_00,01001_0014_01,3,,,4,0,2051,1,1
|
||||
10020001,1002,Quarter,1,100001,10020001,1,2,3867,3108,3025,01002_0001_00,01002_0001_01,1,,,1,0,0,1,1
|
||||
10020002,1002,Clearheaded,2,200001,10020002,1,2,3196,2943,3861,01002_0002_00,01002_0002_01,1,,,1,0,0,1,1
|
||||
10020003,1002,Universally Popular,3,300001,10020003,1,2,2962,3805,3233,01002_0003_00,01002_0003_01,1,,,1,0,0,1,1
|
||||
10020004,1002,Exceptional Athlete,2,200001,10020004,1,2,3166,2807,4027,01002_0004_00,01002_0004_01,1,,,1,0,0,1,1
|
||||
10020005,1002,Sense of Duty,3,300001,10020005,1,2,3063,3608,3329,01002_0005_00,01002_0005_01,1,,,1,0,0,1,1
|
||||
10020006,1002,Student Council Prez,1,100001,10020006,1,2,3926,2840,3234,01002_0006_00,01002_0006_01,1,,,1,0,0,1,1
|
||||
10020007,1002,Before Falling Asleep,2,200001,10020007,1,2,3083,3008,3909,01002_0007_00,01002_0007_01,1,,,1,0,0,1,1
|
||||
10020008,1002,I'm Going Out!,1,100001,10020008,1,2,4015,2866,3119,01002_0008_00,01002_0008_01,1,,,1,0,0,1,1
|
||||
10020009,1002,Let's Be Supportive!,3,300001,10020009,1,2,3195,4009,2796,01002_0009_00,01002_0009_01,1,,,1,0,0,1,1
|
||||
10020010,1002,Harasho!,1,100002,10020010,2,3,4487,3621,3392,01002_0010_00,01002_0010_01,2,b_card_0001,b_card_0074,1,0,0,1,1
|
||||
10020011,1002,Eli's Confessional,2,200002,10020011,2,3,3783,3385,4332,01002_0011_00,01002_0011_01,2,b_card_0008,b_card_0033,1,0,0,1,1
|
||||
10020012,1002,Sun Shower,3,300002,10020012,2,3,3656,4281,3563,01002_0012_00,01002_0012_01,2,b_card_0011,b_card_0039,1,0,0,1,1
|
||||
10020013,1002,Evening Student Council Room,3,300004,10020013,3,4,3954,5270,3776,01002_0013_00,01002_0013_01,3,,,1,10020013,0,1,1
|
||||
10020014,1002,Arisa's Prank?,2,200003,10020014,3,4,3958,4091,4951,01002_0014_00,01002_0014_01,3,,,4,0,1987,1,1
|
||||
10030001,1003,Soft and Gentle,1,100001,10030001,1,2,3940,2872,3188,01003_0001_00,01003_0001_01,1,,,1,0,0,1,1
|
||||
10030002,1003,Actually a Maid,2,200001,10030002,1,2,2938,3073,3989,01003_0002_00,01003_0002_01,1,,,1,0,0,1,1
|
||||
10030003,1003,Come Play with Kotori!,3,300001,10030003,1,2,3202,3717,3081,01003_0003_00,01003_0003_01,1,,,1,0,0,1,1
|
||||
10030004,1003,I'm Ready to Roll!,2,200001,10030004,1,2,3200,3042,3758,01003_0004_00,01003_0004_01,1,,,1,0,0,1,1
|
||||
10030005,1003,Here Goes!,3,300001,10030005,1,2,3209,3635,3156,01003_0005_00,01003_0005_01,1,,,1,0,0,1,1
|
||||
10030006,1003,Heart Sign,1,100001,10030006,1,2,3764,2937,3299,01003_0006_00,01003_0006_01,1,,,1,0,0,1,1
|
||||
10030007,1003,Sleepy Time,2,200001,10030007,1,2,2987,2914,4099,01003_0007_00,01003_0007_01,1,,,1,0,0,1,1
|
||||
10030008,1003,Dressing Up to Go Out,1,100001,10030008,1,2,4028,2893,3079,01003_0008_00,01003_0008_01,1,,,1,0,0,1,1
|
||||
10030009,1003,Flying Down the Court,3,300001,10030009,1,2,3323,3624,3053,01003_0009_00,01003_0009_01,1,,,1,0,0,1,1
|
||||
10030010,1003,Goddess of Healing,1,100002,10030010,2,3,4500,3609,3391,01003_0010_00,01003_0010_01,2,b_card_0001,b_card_0075,1,0,0,1,1
|
||||
10030011,1003,Wonderful Treats,2,200002,10030011,2,3,3668,3662,4170,01003_0011_00,01003_0011_01,2,b_adv_0022,b_card_0018,1,0,0,1,1
|
||||
10030012,1003,Feeling Like a Sheep,3,300002,10030012,2,3,3667,4383,3450,01003_0012_00,01003_0012_01,2,b_card_0002,b_card_0039,1,0,0,1,1
|
||||
10030013,1003,Welcome!,2,200004,10030013,3,4,3725,3960,5315,01003_0013_00,01003_0013_01,3,,,1,10030013,0,1,1
|
||||
10030014,1003,Don't Get It Wrong!,3,300003,10030014,3,4,4030,5285,3685,01003_0014_00,01003_0014_01,3,,,4,0,2052,1,1
|
||||
10040001,1004,The Ideal Lady,1,100001,10040001,1,2,3815,3193,2992,01004_0001_00,01004_0001_01,1,,,1,0,0,1,1
|
||||
10040002,1004,Dancing Master,2,200001,10040002,1,2,3061,3124,3815,01004_0002_00,01004_0002_01,1,,,1,0,0,1,1
|
||||
10040003,1004,Dignified,3,300001,10040003,1,2,3081,3934,2985,01004_0003_00,01004_0003_01,1,,,1,0,0,1,1
|
||||
10040004,1004,Harsh Practice,2,200001,10040004,1,2,3114,2955,3931,01004_0004_00,01004_0004_01,1,,,1,0,0,1,1
|
||||
10040005,1004,Loosening Up,3,300001,10040005,1,2,2861,4081,3058,01004_0005_00,01004_0005_01,1,,,1,0,0,1,1
|
||||
10040006,1004,The Ideal Smile,1,100001,10040006,1,2,3732,3209,3059,01004_0006_00,01004_0006_01,1,,,1,0,0,1,1
|
||||
10040007,1004,Goodnight Greeting,2,200001,10040007,1,2,3055,3273,3672,01004_0007_00,01004_0007_01,1,,,1,0,0,1,1
|
||||
10040008,1004,Hiker's Express,1,100001,10040008,1,2,3796,2919,3285,01004_0008_00,01004_0008_01,1,,,1,0,0,1,1
|
||||
10040009,1004,Crisp in White,3,300001,10040009,1,2,3022,3641,3337,01004_0009_00,01004_0009_01,1,,,1,0,0,1,1
|
||||
10040010,1004,A Focused Mind,1,100002,10040010,2,3,4452,3673,3375,01004_0010_00,01004_0010_01,2,b_card_0001,b_card_0013,1,0,0,1,1
|
||||
10040011,1004,Love's Bind,2,200002,10040011,2,3,3471,3618,4411,01004_0011_00,01004_0011_01,2,b_adv_0022,b_card_0028,1,0,0,1,1
|
||||
10040012,1004,Lucky White Rabbit,3,300002,10040012,2,3,3522,4678,3300,01004_0012_00,01004_0012_01,2,b_card_0004,b_card_0039,1,0,0,1,1
|
||||
10040013,1004,To Enlightenment,1,100004,10040013,3,4,4773,4158,4069,01004_0013_00,01004_0013_01,3,,,1,10040013,0,1,1
|
||||
10040014,1004,Unified Feelings,2,200003,10040014,3,4,4251,4013,4736,01004_0014_00,01004_0014_01,3,,,4,0,2053,1,1
|
||||
10050001,1005,Athletic,1,100001,10050001,1,2,3821,3019,3160,01005_0001_00,01005_0001_01,1,,,1,0,0,1,1
|
||||
10050002,1005,Always Be Cheerful,2,200001,10050002,1,2,3180,2892,3928,01005_0002_00,01005_0002_01,1,,,1,0,0,1,1
|
||||
10050003,1005,Joyful Jump!,3,300001,10050003,1,2,3107,4073,2820,01005_0003_00,01005_0003_01,1,,,1,0,0,1,1
|
||||
10050004,1005,Good to Go,2,200001,10050004,1,2,3352,2952,3696,01005_0004_00,01005_0004_01,1,,,1,0,0,1,1
|
||||
10050005,1005,Rooftop Practice,3,300001,10050005,1,2,3275,3805,2920,01005_0005_00,01005_0005_01,1,,,1,0,0,1,1
|
||||
10050006,1005,Counting on Mew!,1,100001,10050006,1,2,3915,3180,2905,01005_0006_00,01005_0006_01,1,,,1,0,0,1,1
|
||||
10050007,1005,Getting Ready to Rest,2,200001,10050007,1,2,3001,3191,3808,01005_0007_00,01005_0007_01,1,,,1,0,0,1,1
|
||||
10050008,1005,Let's Go Hiking!,1,100001,10050008,1,2,3751,3113,3136,01005_0008_00,01005_0008_01,1,,,1,0,0,1,1
|
||||
10050009,1005,Competing in Speed,3,300001,10050009,1,2,3019,3809,3172,01005_0009_00,01005_0009_01,1,,,1,0,0,1,1
|
||||
10050010,1005,μ's Was Here,1,100002,10050010,2,3,4192,3481,3827,01005_0010_00,01005_0010_01,2,b_card_0001,b_card_0028,1,0,0,1,1
|
||||
10050011,1005,Check Out Rin!,2,200002,10050011,2,3,3564,3272,4664,01005_0011_00,01005_0011_01,2,b_card_0005,b_card_0034,1,0,0,1,1
|
||||
10050012,1005,Fickle Kitten,3,300002,10050012,2,3,3508,4533,3459,01005_0012_00,01005_0012_01,2,b_card_0006,b_card_0039,1,0,0,1,1
|
||||
10050013,1005,Dazzling Rooftop,3,300004,10050013,3,4,4136,4958,3906,01005_0013_00,01005_0013_01,3,,,1,10050013,0,1,1
|
||||
10050014,1005,My 1st Homemade Chocolate,1,100003,10050014,3,4,5229,3828,3943,01005_0014_00,01005_0014_01,3,,,4,0,2021,1,1
|
||||
10060001,1006,Hospital Heiress,1,100001,10060001,1,2,3748,3179,3073,01006_0001_00,01006_0001_01,1,,,1,0,0,1,1
|
||||
10060002,1006,On a High Horse,2,200001,10060002,1,2,3136,3023,3841,01006_0002_00,01006_0002_01,1,,,1,0,0,1,1
|
||||
10060003,1006,Hold My Head up High,3,300001,10060003,1,2,3216,3632,3152,01006_0003_00,01006_0003_01,1,,,1,0,0,1,1
|
||||
10060004,1006,Practice Confidently,2,200001,10060004,1,2,3301,2932,3767,01006_0004_00,01006_0004_01,1,,,1,0,0,1,1
|
||||
10060005,1006,Start with Stretching,3,300001,10060005,1,2,2944,3999,3057,01006_0005_00,01006_0005_01,1,,,1,0,0,1,1
|
||||
10060006,1006,Strong Opinions,1,100001,10060006,1,2,4025,2960,3015,01006_0006_00,01006_0006_01,1,,,1,0,0,1,1
|
||||
10060007,1006,Plans for Tomorrow,2,200001,10060007,1,2,2841,3071,4088,01006_0007_00,01006_0007_01,1,,,1,0,0,1,1
|
||||
10060008,1006,Young Lady’s Jaunt,1,100001,10060008,1,2,3775,2938,3287,01006_0008_00,01006_0008_01,1,,,1,0,0,1,1
|
||||
10060009,1006,Land the Spiral,3,300001,10060009,1,2,2955,3878,3167,01006_0009_00,01006_0009_01,1,,,1,0,0,1,1
|
||||
10060010,1006,After-School Diva,1,100002,10060010,2,3,4433,3516,3551,01006_0010_00,01006_0010_01,2,b_card_0001,b_card_0033,1,0,0,1,1
|
||||
10060011,1006,Secret Exam Room,2,200002,10060011,2,3,3697,3487,4316,01006_0011_00,01006_0011_01,2,b_adv_0022,b_card_0075,1,0,0,1,1
|
||||
10060012,1006,You're My Next Target,3,300002,10060012,2,3,3563,4649,3288,01006_0012_00,01006_0012_01,2,b_card_0007,b_card_0039,1,0,0,1,1
|
||||
10060013,1006,Smartphone Shyness,2,200004,10060013,3,4,4107,4070,4823,01006_0013_00,01006_0013_01,3,,,1,10060013,0,1,1
|
||||
10060014,1006,Fruit Tea,3,300003,10060014,3,4,3984,4866,4150,01006_0014_00,01006_0014_01,3,,,4,0,2022,1,1
|
||||
10070001,1007,Surprising Strategist,1,100001,10070001,1,2,3880,3020,3100,01007_0001_00,01007_0001_01,1,,,1,0,0,1,1
|
||||
10070002,1007,I'll Pull You In!,2,200001,10070002,1,2,3075,2825,4100,01007_0002_00,01007_0002_01,1,,,1,0,0,1,1
|
||||
10070003,1007,Nonchalant,3,300001,10070003,1,2,2862,4066,3072,01007_0003_00,01007_0003_01,1,,,1,0,0,1,1
|
||||
10070004,1007,Blinding Light,2,200001,10070004,1,2,2920,3043,4037,01007_0004_00,01007_0004_01,1,,,1,0,0,1,1
|
||||
10070005,1007,Time to Practice!,3,300001,10070005,1,2,2982,4060,2958,01007_0005_00,01007_0005_01,1,,,1,0,0,1,1
|
||||
10070006,1007,The Power of Fortune-Telling,1,100001,10070006,1,2,3648,3299,3053,01007_0006_00,01007_0006_01,1,,,1,0,0,1,1
|
||||
10070007,1007,See You Tomorrow,2,200001,10070007,1,2,3141,3209,3650,01007_0007_00,01007_0007_01,1,,,1,0,0,1,1
|
||||
10070008,1007,A Good Day to Go Out,1,100001,10070008,1,2,3736,2955,3309,01007_0008_00,01007_0008_01,1,,,1,0,0,1,1
|
||||
10070009,1007,I'm Gonna Attack!,3,300001,10070009,1,2,3273,3854,2873,01007_0009_00,01007_0009_01,1,,,1,0,0,1,1
|
||||
10070010,1007,Spiritual Power,1,100002,10070010,2,3,4564,3417,3519,01007_0010_00,01007_0010_01,2,b_card_0001,b_card_0074,1,0,0,1,1
|
||||
10070011,1007,Cards of Destiny,2,200002,10070011,2,3,3440,3781,4279,01007_0011_00,01007_0011_01,2,b_adv_0022,b_card_0033,1,0,0,1,1
|
||||
10070012,1007,Faking Sleep,3,300002,10070012,2,3,3583,4310,3607,01007_0012_00,01007_0012_01,2,b_card_0009,b_card_0039,1,0,0,1,1
|
||||
10070013,1007,Rain of Light,1,100004,10070013,3,4,4954,4084,3962,01007_0013_00,01007_0013_01,3,,,1,10070013,0,1,1
|
||||
10070014,1007,Surprise Wish!,2,200003,10070014,3,4,4202,3816,4982,01007_0014_00,01007_0014_01,3,,,4,0,1988,1,1
|
||||
10080001,1008,White Rice Fanatic,1,100001,10080001,1,2,3970,3061,2969,01008_0001_00,01008_0001_01,1,,,1,0,0,1,1
|
||||
10080002,1008,Not So Confident...,2,200001,10080002,1,2,2954,3047,3999,01008_0002_00,01008_0002_01,1,,,1,0,0,1,1
|
||||
10080003,1008,Admiration of Idols,3,300001,10080003,1,2,3035,3764,3201,01008_0003_00,01008_0003_01,1,,,1,0,0,1,1
|
||||
10080004,1008,I'll Give It My All!,2,200001,10080004,1,2,2993,3127,3880,01008_0004_00,01008_0004_01,1,,,1,0,0,1,1
|
||||
10080005,1008,I Want to Improve,3,300001,10080005,1,2,3083,3831,3086,01008_0005_00,01008_0005_01,1,,,1,0,0,1,1
|
||||
10080006,1008,Shy of Strangers,1,100001,10080006,1,2,4017,3121,2862,01008_0006_00,01008_0006_01,1,,,1,0,0,1,1
|
||||
10080007,1008,Lonely by Myself,2,200001,10080007,1,2,3076,3143,3781,01008_0007_00,01008_0007_01,1,,,1,0,0,1,1
|
||||
10080008,1008,Excited to Go Out!,1,100001,10080008,1,2,3843,3219,2938,01008_0008_00,01008_0008_01,1,,,1,0,0,1,1
|
||||
10080009,1008,Whole Mikan Oranges,3,300001,10080009,1,2,3268,3827,2905,01008_0009_00,01008_0009_01,1,,,1,0,0,1,1
|
||||
10080010,1008,Freshly Cooked Rice!,1,100002,10080010,2,3,4460,3632,3408,01008_0010_00,01008_0010_01,2,b_card_0001,b_card_0028,1,0,0,1,1
|
||||
10080011,1008,Your Order is Ready!,2,200002,10080011,2,3,3594,3202,4704,01008_0011_00,01008_0011_01,2,b_card_0003,b_card_0023,1,0,0,1,1
|
||||
10080012,1008,Strange Sympathy,3,300002,10080012,2,3,3322,4681,3497,01008_0012_00,01008_0012_01,2,b_card_0012,b_card_0043,1,0,0,1,1
|
||||
10080013,1008,Feelings for µ's,3,300004,10080013,3,4,4123,4952,3925,01008_0013_00,01008_0013_01,3,,,1,10080013,0,1,1
|
||||
10080014,1008,Glittering Lips,1,100003,10080014,3,4,4678,4265,4057,01008_0014_00,01008_0014_01,3,,,4,0,2023,1,1
|
||||
10090001,1009,Idol Otaku,1,100001,10090001,1,2,3706,2950,3344,01009_0001_00,01009_0001_01,1,,,1,0,0,1,1
|
||||
10090002,1009,Working Hard 24/7,2,200001,10090002,1,2,2902,3257,3841,01009_0002_00,01009_0002_01,1,,,1,0,0,1,1
|
||||
10090003,1009,Cute Movement,3,300001,10090003,1,2,3094,3922,2984,01009_0003_00,01009_0003_01,1,,,1,0,0,1,1
|
||||
10090004,1009,Nico Will Do Her Best!,2,200001,10090004,1,2,2856,3135,4009,01009_0004_00,01009_0004_01,1,,,1,0,0,1,1
|
||||
10090005,1009,No One Works Harder,3,300001,10090005,1,2,2854,4045,3101,01009_0005_00,01009_0005_01,1,,,1,0,0,1,1
|
||||
10090006,1009,Nico-Ni for All!,1,100001,10090006,1,2,3839,3104,3057,01009_0006_00,01009_0006_01,1,,,1,0,0,1,1
|
||||
10090007,1009,Hold Me Tight,2,200001,10090007,1,2,3049,3349,3602,01009_0007_00,01009_0007_01,1,,,1,0,0,1,1
|
||||
10090008,1009,The Wait's Over!,1,100001,10090008,1,2,3859,2883,3258,01009_0008_00,01009_0008_01,1,,,1,0,0,1,1
|
||||
10090009,1009,Training Both Mind & Body,3,300001,10090009,1,2,2851,3935,3214,01009_0009_00,01009_0009_01,1,,,1,0,0,1,1
|
||||
10090010,1009,Nico-Nico-Ni!,1,100002,10090010,2,3,4310,3609,3581,01009_0010_00,01009_0010_01,2,b_card_0001,b_card_0028,1,0,0,1,1
|
||||
10090011,1009,Let Me Teach You!,2,200002,10090011,2,3,3499,3564,4437,01009_0011_00,01009_0011_01,2,b_card_0008,b_card_0028,1,0,0,1,1
|
||||
10090012,1009,Nico's the Most Popular,3,300002,10090012,2,3,3744,4346,3410,01009_0012_00,01009_0012_01,2,b_card_0002,b_card_0039,1,0,0,1,1
|
||||
10090013,1009,A Welcome Lecture,2,200004,10090013,3,4,3754,4011,5235,01009_0013_00,01009_0013_01,3,,,1,10090013,0,1,1
|
||||
10090014,1009,Watermelon Cake?,3,300003,10090014,3,4,3839,5164,3997,01009_0014_00,01009_0014_01,3,,,4,0,1989,1,1
|
||||
20010001,2001,Beloved School Idols,2,200001,20010001,1,2,3256,2951,3793,02001_0001_00,02001_0001_01,1,,,1,0,0,1,1
|
||||
20010002,2001,Dreams Come True!,1,100001,20010002,1,2,3982,3042,2976,02001_0002_00,02001_0002_01,1,,,1,0,0,1,1
|
||||
20010003,2001,Gotta Give It a Try,3,300001,20010003,1,2,3124,3873,3003,02001_0003_00,02001_0003_01,1,,,1,0,0,1,1
|
||||
20010004,2001,Sore Loser,2,200001,20010004,1,2,3307,3049,3644,02001_0004_00,02001_0004_01,1,,,1,0,0,1,1
|
||||
20010005,2001,Packing for a Trip,1,100001,20010005,1,2,3779,2929,3292,02001_0005_00,02001_0005_01,1,,,1,0,0,1,1
|
||||
20010006,2001,Sending Out My Feelings,3,300001,20010006,1,2,3036,4080,2884,02001_0006_00,02001_0006_01,1,,,1,0,0,1,1
|
||||
20010007,2001,Swimming Weather!,2,200001,20010007,1,2,3289,3088,3623,02001_0007_00,02001_0007_01,1,,,1,0,0,1,1
|
||||
20010008,2001,Mikan Orange Power!,1,100002,20010008,2,3,4224,3467,3809,02001_0008_00,02001_0008_01,2,b_card_0045,b_adv_0019,1,0,0,1,1
|
||||
20010009,2001,Time to Brush!,2,200002,20010009,2,3,3483,3608,4409,02001_0009_00,02001_0009_01,2,b_card_0085,b_st_0004,1,0,0,1,1
|
||||
20010010,2001,Koala Nap,3,300002,20010010,2,3,3513,4440,3547,02001_0010_00,02001_0010_01,2,b_card_0041,b_card_0078,1,0,0,1,1
|
||||
20010011,2001,Post-Practice Walk & Talk,1,100006,20010011,3,4,5181,3778,4041,02001_0011_00,02001_0011_01,3,,,1,20010011,0,1,1
|
||||
20010012,2001,Orange Mermaid,2,200003,20010012,3,4,4022,3870,5108,02001_0012_00,02001_0012_01,3,,,4,0,2034,1,1
|
||||
20020001,2002,Here to Aid Everyone,2,200001,20020001,1,2,2980,3063,3957,02002_0001_00,02002_0001_01,1,,,1,0,0,1,1
|
||||
20020002,2002,Transfer Student from the City,1,100001,20020002,1,2,3834,3255,2911,02002_0002_00,02002_0002_01,1,,,1,0,0,1,1
|
||||
20020003,2002,Let's Have Some Fun!,3,300001,20020003,1,2,3170,3677,3153,02002_0003_00,02002_0003_01,1,,,1,0,0,1,1
|
||||
20020004,2002,Worked up a Sweat,2,200001,20020004,1,2,3065,2971,3964,02002_0004_00,02002_0004_01,1,,,1,0,0,1,1
|
||||
20020005,2002,Going All Over,1,100001,20020005,1,2,4009,2816,3175,02002_0005_00,02002_0005_01,1,,,1,0,0,1,1
|
||||
20020006,2002,Let's Have Tons of Fun,3,300001,20020006,1,2,2946,3747,3307,02002_0006_00,02002_0006_01,1,,,1,0,0,1,1
|
||||
20020007,2002,Uchiura's Appeal,3,300001,20020007,1,2,3146,4089,2765,02002_0007_00,02002_0007_01,1,,,1,0,0,1,1
|
||||
20020008,2002,Toward a New Me,1,100002,20020008,2,3,4430,3717,3353,02002_0008_00,02002_0008_01,2,b_card_0046,b_adv_0019,1,0,0,1,1
|
||||
20020009,2002,Time for Your Shot,2,200002,20020009,2,3,3474,3604,4422,02002_0009_00,02002_0009_01,2,b_card_0061,b_st_0004,1,0,0,1,1
|
||||
20020010,2002,Performance Partner,3,300002,20020010,2,3,3427,4602,3471,02002_0010_00,02002_0010_01,2,b_card_0041,b_card_0078,1,0,0,1,1
|
||||
20020011,2002,Trio's Melody,3,300004,20020011,3,4,4060,5028,3912,02002_0011_00,02002_0011_01,3,,,1,20020011,0,1,1
|
||||
20020012,2002,Apple's Temptation,1,100003,20020012,3,4,4930,4155,3915,02002_0012_00,02002_0012_01,3,,,4,0,2035,1,1
|
||||
20030001,2003,Grownup Personality,2,200001,20030001,1,2,3108,3202,3690,02003_0001_00,02003_0001_01,1,,,1,0,0,1,1
|
||||
20030002,2003,Shopping Support,1,100001,20030002,1,2,3996,2901,3103,02003_0002_00,02003_0002_01,1,,,1,0,0,1,1
|
||||
20030003,2003,Wanna Go Out?,3,300001,20030003,1,2,2827,3954,3219,02003_0003_00,02003_0003_01,1,,,1,0,0,1,1
|
||||
20030004,2003,Tie Back Your Hair,2,200001,20030004,1,2,3090,3040,3870,02003_0004_00,02003_0004_01,1,,,1,0,0,1,1
|
||||
20030005,2003,"Far, Far Away",1,100001,20030005,1,2,3642,3137,3221,02003_0005_00,02003_0005_01,1,,,1,0,0,1,1
|
||||
20030006,2003,All Systems Go,3,300001,20030006,1,2,3124,3856,3020,02003_0006_00,02003_0006_01,1,,,1,0,0,1,1
|
||||
20030007,2003,Surfing's My Forte,1,100001,20030007,1,2,3624,3057,3319,02003_0007_00,02003_0007_01,1,,,1,0,0,1,1
|
||||
20030008,2003,Costume Fitting,1,100002,20030008,2,3,4646,3317,3537,02003_0008_00,02003_0008_01,2,b_adv_0018,b_adv_0019,1,0,0,1,1
|
||||
20030009,2003,"Try, Try Again!",2,200002,20030009,2,3,3333,3679,4488,02003_0009_00,02003_0009_01,2,b_card_0056,b_adv_0019,1,0,0,1,1
|
||||
20030010,2003,Entranced by Nature,3,300002,20030010,2,3,3750,4318,3432,02003_0010_00,02003_0010_01,2,b_card_0055,b_card_0078,1,0,0,1,1
|
||||
20030011,2003,Sea Breeze's Kiss,2,200004,20030011,3,4,4081,3838,5081,02003_0011_00,02003_0011_01,3,,,1,20030011,0,1,1
|
||||
20030012,2003,Ring Finger,3,300003,20030012,3,4,4229,4809,3962,02003_0012_00,02003_0012_01,3,,,4,0,2005,1,1
|
||||
20040001,2004,Famous Daughter,2,200001,20040001,1,2,3230,3139,3631,02004_0001_00,02004_0001_01,1,,,1,0,0,1,1
|
||||
20040002,2004,Perfectionist,1,100001,20040002,1,2,3775,3236,2989,02004_0002_00,02004_0002_01,1,,,1,0,0,1,1
|
||||
20040003,2004,Zero Defects Allowed,3,300001,20040003,1,2,3212,3931,2857,02004_0003_00,02004_0003_01,1,,,1,0,0,1,1
|
||||
20040004,2004,Aim for the Top,2,200001,20040004,1,2,3070,3207,3723,02004_0004_00,02004_0004_01,1,,,1,0,0,1,1
|
||||
20040005,2004,How Far Can We Go?,1,100001,20040005,1,2,4089,2919,2992,02004_0005_00,02004_0005_01,1,,,1,0,0,1,1
|
||||
20040006,2004,Meetup at the Sluice Gate,3,300001,20040006,1,2,3177,3994,2829,02004_0006_00,02004_0006_01,1,,,1,0,0,1,1
|
||||
20040007,2004,Lighting Up Uchiura,1,100001,20040007,1,2,3708,3316,2976,02004_0007_00,02004_0007_01,1,,,1,0,0,1,1
|
||||
20040008,2004,The Limit Is 2 cm!,1,100002,20040008,2,3,4692,3555,3253,02004_0008_00,02004_0008_01,2,b_card_0047,b_adv_0019,1,0,0,1,1
|
||||
20040009,2004,We Are Aqours!,2,200002,20040009,2,3,3476,3754,4270,02004_0009_00,02004_0009_01,2,b_card_0056,b_adv_0019,1,0,0,1,1
|
||||
20040010,2004,Twist of History,3,300002,20040010,2,3,3758,4281,3461,02004_0010_00,02004_0010_01,2,b_card_0055,b_card_0078,1,0,0,1,1
|
||||
20040011,2004,Sister's Routine,1,100004,20040011,3,4,5180,4072,3748,02004_0011_00,02004_0011_01,3,,,1,20040011,0,1,1
|
||||
20040012,2004,Beware of Wolf,2,200003,20040012,3,4,3749,3943,5308,02004_0012_00,02004_0012_01,3,,,4,0,2006,1,1
|
||||
20050001,2005,Aye Aye!,2,200001,20050001,1,2,3201,2911,3888,02005_0001_00,02005_0001_01,1,,,1,0,0,1,1
|
||||
20050002,2005,Aspiring Captain,1,100001,20050002,1,2,4099,3086,2815,02005_0002_00,02005_0002_01,1,,,1,0,0,1,1
|
||||
20050003,2005,Chika's Mikan Oranges,3,300001,20050003,1,2,3076,3659,3265,02005_0003_00,02005_0003_01,1,,,1,0,0,1,1
|
||||
20050004,2005,Time to Set Sail,2,200001,20050004,1,2,2948,3101,3951,02005_0004_00,02005_0004_01,1,,,1,0,0,1,1
|
||||
20050005,2005,All Aboard!,1,100001,20050005,1,2,4095,2776,3129,02005_0005_00,02005_0005_01,1,,,1,0,0,1,1
|
||||
20050006,2005,Excuse Me!,3,300001,20050006,1,2,2952,3700,3348,02005_0006_00,02005_0006_01,1,,,1,0,0,1,1
|
||||
20050007,2005,Seaside Swimming Spot,2,200001,20050007,1,2,3147,3027,3826,02005_0007_00,02005_0007_01,1,,,1,0,0,1,1
|
||||
20050008,2005,Costume-Making,1,100002,20050008,2,3,4166,3829,3505,02005_0008_00,02005_0008_01,2,b_card_0048,b_adv_0019,1,0,0,1,1
|
||||
20050009,2005,Come a Little Closer,2,200002,20050009,2,3,3723,3484,4293,02005_0009_00,02005_0009_01,2,b_card_0056,b_adv_0019,1,0,0,1,1
|
||||
20050010,2005,The Culprit...Is You!,3,300002,20050010,2,3,3522,4718,3260,02005_0010_00,02005_0010_01,2,b_card_0060,b_st_0004,1,0,0,1,1
|
||||
20050011,2005,Sparkling Water,3,300004,20050011,3,4,3886,4888,4226,02005_0011_00,02005_0011_01,3,,,1,20050011,0,1,1
|
||||
20050012,2005,Bridal Countdown,1,100003,20050012,3,4,4705,3974,4321,02005_0012_00,02005_0012_01,3,,,4,0,2036,1,1
|
||||
20060001,2006,Meeting Yohane!,2,200001,20060001,1,2,3166,3207,3627,02006_0001_00,02006_0001_01,1,,,1,0,0,1,1
|
||||
20060002,2006,Fallen Angel Yohane,1,100001,20060002,1,2,3704,3297,2999,02006_0002_00,02006_0002_01,1,,,1,0,0,1,1
|
||||
20060003,2006,A Sinful Devil,3,300001,20060003,1,2,2875,4079,3046,02006_0003_00,02006_0003_01,1,,,1,0,0,1,1
|
||||
20060004,2006,Fall from Grace,2,200001,20060004,1,2,3174,3187,3639,02006_0004_00,02006_0004_01,1,,,1,0,0,1,1
|
||||
20060005,2006,This Is Temporary!,1,100001,20060005,1,2,3959,3059,2982,02006_0005_00,02006_0005_01,1,,,1,0,0,1,1
|
||||
20060006,2006,Descend with Me,3,300001,20060006,1,2,3192,3712,3096,02006_0006_00,02006_0006_01,1,,,1,0,0,1,1
|
||||
20060007,2006,Seaside Fallen Angel,3,300001,20060007,1,2,3257,3670,3073,02006_0007_00,02006_0007_01,1,,,1,0,0,1,1
|
||||
20060008,2006,Sinfully Dark Dress,1,100002,20060008,2,3,4421,3573,3506,02006_0008_00,02006_0008_01,2,b_card_0049,b_adv_0019,1,0,0,1,1
|
||||
20060009,2006,Ultimate Fallen Angel Cheer,2,200002,20060009,2,3,3502,3626,4372,02006_0009_00,02006_0009_01,2,b_card_0056,b_adv_0019,1,0,0,1,1
|
||||
20060010,2006,Black Magic Woman,3,300002,20060010,2,3,3478,4639,3383,02006_0010_00,02006_0010_01,2,b_card_0033,b_st_0004,1,0,0,1,1
|
||||
20060011,2006,Fallen Angel R-P-S,2,200004,20060011,3,4,4071,3931,4998,02006_0011_00,02006_0011_01,3,,,1,20060011,0,1,1
|
||||
20060012,2006,Descent into Hellfire,3,300003,20060012,3,4,3994,5223,3783,02006_0012_00,02006_0012_01,3,,,4,0,1951,1,1
|
||||
20070001,2007,Temple's Daughter,2,200001,20070001,1,2,3141,3189,3670,02007_0001_00,02007_0001_01,1,,,1,0,0,1,1
|
||||
20070002,2007,Lover of Literature,1,100001,20070002,1,2,3836,3051,3113,02007_0002_00,02007_0002_01,1,,,1,0,0,1,1
|
||||
20070003,2007,Chilling at the Library,3,300001,20070003,1,2,3147,3842,3011,02007_0003_00,02007_0003_01,1,,,1,0,0,1,1
|
||||
20070004,2007,I'll Do My Best,2,200001,20070004,1,2,2863,3100,4037,02007_0004_00,02007_0004_01,1,,,1,0,0,1,1
|
||||
20070005,2007,Bookworm's Day Out,1,100001,20070005,1,2,3896,3078,3026,02007_0005_00,02007_0005_01,1,,,1,0,0,1,1
|
||||
20070006,2007,After Choir Practice,3,300001,20070006,1,2,2949,3925,3126,02007_0006_00,02007_0006_01,1,,,1,0,0,1,1
|
||||
20070007,2007,At the Uchiura Shore,1,100001,20070007,1,2,3850,2990,3160,02007_0007_00,02007_0007_01,1,,,1,0,0,1,1
|
||||
20070008,2007,My Books Are My Fortune,1,100002,20070008,2,3,4206,3734,3560,02007_0008_00,02007_0008_01,2,b_card_0050,b_adv_0019,1,0,0,1,1
|
||||
20070009,2007,Every Day's an Adventure,2,200002,20070009,2,3,3598,3749,4153,02007_0009_00,02007_0009_01,2,b_card_0055,b_card_0078,1,0,0,1,1
|
||||
20070010,2007,Cubify the Ball,3,300002,20070010,2,3,3725,4218,3557,02007_0010_00,02007_0010_01,2,b_card_0063,b_st_0004,1,0,0,1,1
|
||||
20070011,2007,After Lunch,1,100004,20070011,3,4,4877,4127,3996,02007_0011_00,02007_0011_01,3,,,1,20070011,0,1,1
|
||||
20070012,2007,Unfading Beauty,2,200003,20070012,3,4,4009,4181,4810,02007_0012_00,02007_0012_01,3,,,4,0,1952,1,1
|
||||
20080001,2008,Ciao♪,2,200001,20080001,1,2,2891,3097,4012,02008_0001_00,02008_0001_01,1,,,1,0,0,1,1
|
||||
20080002,2008,Chairwoman,1,100001,20080002,1,2,3665,3137,3198,02008_0002_00,02008_0002_01,1,,,1,0,0,1,1
|
||||
20080003,2008,Shiny☆,3,300001,20080003,1,2,3092,3715,3193,02008_0003_00,02008_0003_01,1,,,1,0,0,1,1
|
||||
20080004,2008,Fearless Challenger,2,200001,20080004,1,2,3346,2976,3678,02008_0004_00,02008_0004_01,1,,,1,0,0,1,1
|
||||
20080005,2008,Equestrian Lessons,1,100001,20080005,1,2,3859,3020,3121,02008_0005_00,02008_0005_01,1,,,1,0,0,1,1
|
||||
20080006,2008,Out and About with Mari,3,300001,20080006,1,2,3159,4078,2763,02008_0006_00,02008_0006_01,1,,,1,0,0,1,1
|
||||
20080007,2008,Uchiura is the Best!,3,300001,20080007,1,2,3151,3807,3042,02008_0007_00,02008_0007_01,1,,,1,0,0,1,1
|
||||
20080008,2008,Resort Outfit,1,100002,20080008,2,3,4547,3338,3615,02008_0008_00,02008_0008_01,2,b_card_0051,b_adv_0019,1,0,0,1,1
|
||||
20080009,2008,Love Potion,2,200002,20080009,2,3,3244,3643,4613,02008_0009_00,02008_0009_01,2,b_card_0061,b_st_0004,1,0,0,1,1
|
||||
20080010,2008,Flaming Passion,3,300002,20080010,2,3,3362,4594,3544,02008_0010_00,02008_0010_01,2,b_card_0041,b_card_0078,1,0,0,1,1
|
||||
20080011,2008,So Picturesque,3,300004,20080011,3,4,4086,4760,4154,02008_0011_00,02008_0011_01,3,,,1,20080011,0,1,1
|
||||
20080012,2008,Fruit Carnival!,1,100003,20080012,3,4,4797,3980,4223,02008_0012_00,02008_0012_01,3,,,4,0,2007,1,1
|
||||
20090001,2009,Crybaby,2,200001,20090001,1,2,3103,2805,4092,02009_0001_00,02009_0001_01,1,,,1,0,0,1,1
|
||||
20090002,2009,Easily Frightened,1,100001,20090002,1,2,3660,3059,3281,02009_0002_00,02009_0002_01,1,,,1,0,0,1,1
|
||||
20090003,2009,Sewing Specialist,3,300001,20090003,1,2,3108,3951,2941,02009_0003_00,02009_0003_01,1,,,1,0,0,1,1
|
||||
20090004,2009,Aim to Be an Idol,2,200001,20090004,1,2,3156,2832,4012,02009_0004_00,02009_0004_01,1,,,1,0,0,1,1
|
||||
20090005,2009,Let's Travel Far Away,1,100001,20090005,1,2,3719,3228,3053,02009_0005_00,02009_0005_01,1,,,1,0,0,1,1
|
||||
20090006,2009,Waiting On My Sister,3,300001,20090006,1,2,2860,3892,3248,02009_0006_00,02009_0006_01,1,,,1,0,0,1,1
|
||||
20090007,2009,Warm Sandy Beach,2,200001,20090007,1,2,2884,3263,3853,02009_0007_00,02009_0007_01,1,,,1,0,0,1,1
|
||||
20090008,2009,I Can Do It!,1,100002,20090008,2,3,4516,3604,3380,02009_0008_00,02009_0008_01,2,b_card_0052,b_adv_0019,1,0,0,1,1
|
||||
20090009,2009,Cheerleader Tryout,2,200002,20090009,2,3,3542,3760,4198,02009_0009_00,02009_0009_01,2,b_card_0056,b_adv_0019,1,0,0,1,1
|
||||
20090010,2009,Ruby's Courage,3,300002,20090010,2,3,3556,4382,3562,02009_0010_00,02009_0010_01,2,b_card_0041,b_card_0078,1,0,0,1,1
|
||||
20090011,2009,Sleepyhead,2,200004,20090011,3,4,4249,4054,4697,02009_0011_00,02009_0011_01,3,,,1,20090011,0,1,1
|
||||
20090012,2009,Note the Flowers,3,300003,20090012,3,4,3982,4735,4283,02009_0012_00,02009_0012_01,3,,,4,0,1953,1,1
|
||||
30010001,3001,Gracefully,1,100001,30010001,1,2,3671,3226,3103,03001_0001_00,03001_0001_01,1,,,1,0,0,1,1
|
||||
30010002,3001,One Step at a Time,2,200001,30010002,1,2,3228,2983,3789,03001_0002_00,03001_0002_01,1,,,1,0,0,1,1
|
||||
30010003,3001,Hard Worker,3,300001,30010003,1,2,2907,4025,3068,03001_0003_00,03001_0003_01,1,,,1,0,0,1,1
|
||||
30010004,3001,Flower in the Night Sky,1,100002,30010004,2,3,4267,3708,3525,03001_0004_00,03001_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30010005,3001,Cool Blooming Flower,2,200002,30010005,2,3,3600,3402,4498,03001_0005_00,03001_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30010006,3001,Easter Bunny!,3,300002,30010006,2,3,3576,4202,3722,03001_0006_00,03001_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30010007,3001,Right Next to You,3,300007,30010007,3,4,4136,4805,4059,03001_0007_00,03001_0007_01,3,,,1,30010007,0,1,1
|
||||
30020001,3002,Little Demon,1,100001,30020001,1,2,4101,3024,2875,03002_0001_00,03002_0001_01,1,,,1,0,0,1,1
|
||||
30020002,3002,Kasumin!,2,200001,30020002,1,2,2986,3318,3696,03002_0002_00,03002_0002_01,1,,,1,0,0,1,1
|
||||
30020003,3002,Cuteness Research,3,300001,30020003,1,2,2831,3970,3199,03002_0003_00,03002_0003_01,1,,,1,0,0,1,1
|
||||
30020004,3002,Canary Kasumin,1,100002,30020004,2,3,4216,3688,3596,03002_0004_00,03002_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30020005,3002,Healthy and Cute,2,200002,30020005,2,3,3436,3359,4705,03002_0005_00,03002_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30020006,3002,Search with Kasumin!,3,300002,30020006,2,3,3367,4431,3702,03002_0006_00,03002_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30020007,3002,Rainbow Bread Roll,1,100004,30020007,3,4,4799,4265,3936,03002_0007_00,03002_0007_01,3,,,1,30020007,0,1,1
|
||||
30030001,3003,Red Ribbon,1,100001,30030001,1,2,3629,3230,3141,03003_0001_00,03003_0001_01,1,,,1,0,0,1,1
|
||||
30030002,3003,Capable and Collected,2,200001,30030002,1,2,3095,3015,3890,03003_0002_00,03003_0002_01,1,,,1,0,0,1,1
|
||||
30030003,3003,Theater Club Member,3,300001,30030003,1,2,3060,3626,3314,03003_0003_00,03003_0003_01,1,,,1,0,0,1,1
|
||||
30030004,3003,Azure Heroine,1,100002,30030004,2,3,4302,3421,3777,03003_0004_00,03003_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30030005,3003,Seeking Coolness,2,200002,30030005,2,3,3547,3508,4445,03003_0005_00,03003_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30030006,3003,"Tea Time, Break Time",3,300002,30030006,2,3,3663,4248,3589,03003_0006_00,03003_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30030007,3003,My True Self,2,200004,30030007,3,4,3906,4293,4801,03003_0007_00,03003_0007_01,3,,,1,30030007,0,1,1
|
||||
30040001,3004,Magazine Model,1,100001,30040001,1,2,4070,3030,2900,03004_0001_00,03004_0001_01,1,,,1,0,0,1,1
|
||||
30040002,3004,A Reliable Ally,2,200001,30040002,1,2,3048,3202,3750,03004_0002_00,03004_0002_01,1,,,1,0,0,1,1
|
||||
30040003,3004,With Self Discipline,3,300001,30040003,1,2,3066,3788,3146,03004_0003_00,03004_0003_01,1,,,1,0,0,1,1
|
||||
30040004,3004,Fragrant Folding Fan,1,100002,30040004,2,3,4455,3543,3502,03004_0004_00,03004_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30040005,3004,Passion Is in My Heart,2,200002,30040005,2,3,3355,3693,4452,03004_0005_00,03004_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30040006,3004,Sometimes Cute's the Way,3,300002,30040006,2,3,3414,4547,3539,03004_0006_00,03004_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30040007,3004,The Pursuit of Quality,3,300004,30040007,3,4,3960,5024,4016,03004_0007_00,03004_0007_01,3,,,1,30040007,0,1,1
|
||||
30050001,3005,Everyone's Sun,1,100001,30050001,1,2,3931,3168,2901,03005_0001_00,03005_0001_01,1,,,1,0,0,1,1
|
||||
30050002,3005,Helper,2,200001,30050002,1,2,3030,3034,3936,03005_0002_00,03005_0002_01,1,,,1,0,0,1,1
|
||||
30050003,3005,Ambition,3,300001,30050003,1,2,2841,3971,3188,03005_0003_00,03005_0003_01,1,,,1,0,0,1,1
|
||||
30050004,3005,Summertime Sunshine,1,100002,30050004,2,3,4263,3594,3643,03005_0004_00,03005_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30050005,3005,Water Balloon Splash!,2,200002,30050005,2,3,3622,3280,4598,03005_0005_00,03005_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30050006,3005,Happy Easter!,3,300002,30050006,2,3,3265,4693,3542,03005_0006_00,03005_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30050007,3005,A Change of Pace,1,100004,30050007,3,4,4871,3888,4241,03005_0007_00,03005_0007_01,3,,,1,30050007,0,1,1
|
||||
30060001,3006,At My Own Pace,1,100001,30060001,1,2,3940,3070,2990,03006_0001_00,03006_0001_01,1,,,1,0,0,1,1
|
||||
30060002,3006,Zzz...,2,200001,30060002,1,2,3067,3078,3855,03006_0002_00,03006_0002_01,1,,,1,0,0,1,1
|
||||
30060003,3006,As the Big Sister,3,300001,30060003,1,2,2927,3878,3195,03006_0003_00,03006_0003_01,1,,,1,0,0,1,1
|
||||
30060004,3006,Land of Dreams in Summer,1,100002,30060004,2,3,4511,3642,3347,03006_0004_00,03006_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30060005,3006,Tranquil Morning Trip,2,200002,30060005,2,3,3796,3417,4287,03006_0005_00,03006_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30060006,3006,Follow the Rabbit,3,300002,30060006,2,3,3473,4671,3356,03006_0006_00,03006_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30060007,3006,Sisterly Supper,2,200004,30060007,3,4,3848,3959,5193,03006_0007_00,03006_0007_01,3,,,1,30060007,0,1,1
|
||||
30070001,3007,Hot-Blooded Drive,1,100001,30070001,1,2,3865,3007,3128,03007_0001_00,03007_0001_01,1,,,1,0,0,1,1
|
||||
30070002,3007,Heroic Transformation,2,200001,30070002,1,2,3289,2894,3817,03007_0002_00,03007_0002_01,1,,,1,0,0,1,1
|
||||
30070003,3007,Passionate Soul,3,300001,30070003,1,2,3294,3643,3063,03007_0003_00,03007_0003_01,1,,,1,0,0,1,1
|
||||
30070004,3007,Shine Under the Sun,1,100002,30070004,2,3,4700,3536,3264,03007_0004_00,03007_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30070005,3007,Crimson Pinwheel,2,200002,30070005,2,3,3799,3533,4168,03007_0005_00,03007_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30070006,3007,I Found an Egg!,3,300002,30070006,2,3,3436,4564,3500,03007_0006_00,03007_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30070007,3007,Professing My Love!,3,300004,30070007,3,4,3802,5139,4059,03007_0007_00,03007_0007_01,3,,,1,30070007,0,1,1
|
||||
30080001,3008,Calm but Headstrong,1,100001,30080001,1,2,4018,3014,2968,03008_0001_00,03008_0001_01,1,,,1,0,0,1,1
|
||||
30080002,3008,Swiss Air,2,200001,30080002,1,2,3205,3109,3686,03008_0002_00,03008_0002_01,1,,,1,0,0,1,1
|
||||
30080003,3008,Everyone's Support,3,300001,30080003,1,2,2963,3994,3043,03008_0003_00,03008_0003_01,1,,,1,0,0,1,1
|
||||
30080004,3008,Under the Summer Sun,1,100002,30080004,2,3,4539,3480,3481,03008_0004_00,03008_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30080005,3008,Savoring a Snow Cone,2,200002,30080005,2,3,3534,3713,4253,03008_0005_00,03008_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30080006,3008,I Found the Cutest Egg,3,300002,30080006,2,3,3518,4401,3581,03008_0006_00,03008_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30080007,3008,Gently Filtered Sun,1,100004,30080007,3,4,5327,3807,3866,03008_0007_00,03008_0007_01,3,,,1,30080007,0,1,1
|
||||
30090001,3009,What I Want to Do,1,100001,30090001,1,2,3594,3070,3336,03009_0001_00,03009_0001_01,1,,,1,0,0,1,1
|
||||
30090002,3009,Forming Bonds,2,200001,30090002,1,2,2982,3078,3940,03009_0002_00,03009_0002_01,1,,,1,0,0,1,1
|
||||
30090003,3009,Rina-chan Board,3,300001,30090003,1,2,2987,3833,3180,03009_0003_00,03009_0003_01,1,,,1,0,0,1,1
|
||||
30090004,3009,Rina-chan Fan,1,100002,30090004,2,3,4323,3728,3449,03009_0004_00,03009_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30090005,3009,Cool Off in a Cool Spot,2,200002,30090005,2,3,3670,3660,4170,03009_0005_00,03009_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30090006,3009,Easter Balloon,3,300002,30090006,2,3,3558,4442,3500,03009_0006_00,03009_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30090007,3009,Walker-in-Charge,2,200004,30090007,3,4,3810,3916,5274,03009_0007_00,03009_0007_01,3,,,1,30090007,0,1,1
|
||||
30100001,3010,Where Dreams Begin,1,100001,30100001,1,2,3757,2955,3288,03010_0001_00,03010_0001_01,1,,,1,0,0,1,1
|
||||
30100002,3010,For Everyone's Sake,2,200001,30100002,1,2,3093,3098,3809,03010_0002_00,03010_0002_01,1,,,1,0,0,1,1
|
||||
30100003,3010,Steady Effort,3,300001,30100003,1,2,2790,4032,3178,03010_0003_00,03010_0003_01,1,,,1,0,0,1,1
|
||||
30100004,3010,Fluttering Flowers,1,100002,30100004,2,3,4378,3496,3626,03010_0004_00,03010_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30100005,3010,Blooming in the Shade,2,200002,30100005,2,3,3587,3490,4423,03010_0005_00,03010_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30100006,3010,A Symbol of Revival,3,300002,30100006,2,3,3369,4423,3708,03010_0006_00,03010_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30100007,3010,Diligence!,3,300004,30100007,3,4,4111,4704,4185,03010_0007_00,03010_0007_01,3,,,1,30100007,0,1,1
|
||||
30110001,3011,Grade-Skipper,1,100001,30110001,1,2,3840,2942,3218,03011_0001_00,03011_0001_01,1,,,1,0,0,1,1
|
||||
30110002,3011,New Yorker,2,200001,30110002,1,2,3307,2987,3706,03011_0002_00,03011_0002_01,1,,,1,0,0,1,1
|
||||
30110003,3011,My Song,3,300001,30110003,1,2,2908,3870,3222,03011_0003_00,03011_0003_01,1,,,1,0,0,1,1
|
||||
30110004,3011,Trying on a Yukata,1,100002,30110004,2,3,4610,3345,3545,03011_0004_00,03011_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30110005,3011,"Oh, Sweet Ramune",2,200002,30110005,2,3,3820,3511,4169,03011_0005_00,03011_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30110006,3011,Where Are the Eggs?,3,300002,30110006,2,3,3703,4384,3413,03011_0006_00,03011_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30110007,3011,All-Out Composing,1,100004,30110007,3,4,4815,4179,4006,03011_0007_00,03011_0007_01,3,,,1,30110007,0,1,1
|
||||
30120001,3012,Mou Man Tai! No Prob!,1,100001,30120001,1,2,4048,2794,3158,03012_0001_00,03012_0001_01,1,,,1,0,0,1,1
|
||||
30120002,3012,Born in Hong Kong,2,200001,30120002,1,2,3014,2909,4077,03012_0002_00,03012_0002_01,1,,,1,0,0,1,1
|
||||
30120003,3012,I Can Do Anything,3,300001,30120003,1,2,3167,3945,2888,03012_0003_00,03012_0003_01,1,,,1,0,0,1,1
|
||||
30120004,3012,Nonchalant Strut,1,100002,30120004,2,3,4661,3368,3471,03012_0004_00,03012_0004_01,2,b_card_0013,b_adv_0019,1,0,0,1,1
|
||||
30120005,3012,Crunchy Candy Apple,2,200002,30120005,2,3,3380,3717,4403,03012_0005_00,03012_0005_01,2,b_card_0081,b_card_0074,1,0,0,1,1
|
||||
30120006,3012,Fruit Sandwich,3,300002,30120006,2,3,3676,4155,3669,03012_0006_00,03012_0006_01,2,b_card_0003,b_adv_0021,1,0,0,1,1
|
||||
30120007,3012,Friends and Rivals,2,200004,30120007,3,4,4124,3946,4930,03012_0007_00,03012_0007_01,3,,,1,30120007,0,1,1
|
||||
40010001,4001,Feeling Determined,1,100001,40010001,1,2,3861,2923,3216,04001_0001_00,04001_0001_01,1,,,1,0,0,1,1
|
||||
40010002,4001,I Love to Sing,2,200001,40010002,1,2,3092,2832,4076,04001_0002_00,04001_0002_01,1,,,1,0,0,1,1
|
||||
40010003,4001,Singing at Home,3,300001,40010003,1,2,3089,3807,3104,04001_0003_00,04001_0003_01,1,,,1,0,0,1,1
|
||||
40010004,4001,Cheering Everybody Up,1,100002,40010004,2,3,4457,3676,3367,04001_0004_00,04001_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40010005,4001,A Little Shy,2,200002,40010005,2,3,3428,3720,4352,04001_0005_00,04001_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40010006,4001,Heading Out to Harajuku,3,300002,40010006,2,3,3501,4166,3833,04001_0006_00,04001_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40010007,4001,Heartfelt Feelings,1,100008,40010007,3,4,5292,3855,3853,04001_0007_00,04001_0007_01,3,,,1,40010007,0,1,1
|
||||
40010008,4001,Always Sunny Above the Clouds,3,300003,40010008,3,4,4111,5089,3956,04001_0008_00,04001_0008_01,3,,,4,0,1000,1,223121515
|
||||
40020001,4002,Beeline!,1,100001,40020001,1,2,3617,3318,3065,04002_0001_00,04002_0001_01,1,,,1,0,0,1,1
|
||||
40020002,4002,Born in Shanghai,2,200001,40020002,1,2,3084,3089,3827,04002_0002_00,04002_0002_01,1,,,1,0,0,1,1
|
||||
40020003,4002,Dressing Up at Home,3,300001,40020003,1,2,3163,3910,2927,04002_0003_00,04002_0003_01,1,,,1,0,0,1,1
|
||||
40020004,4002,I'll Do My Very Best!,1,100002,40020004,2,3,4379,3458,3663,04002_0004_00,04002_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40020005,4002,Powerfully Passionate,2,200002,40020005,2,3,3518,3736,4246,04002_0005_00,04002_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40020006,4002,Getting Rough!,3,300002,40020006,2,3,3541,4499,3460,04002_0006_00,04002_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40020007,4002,Costume Stylist,3,300004,40020007,3,4,3825,4983,4192,04002_0007_00,04002_0007_01,3,,,1,40020007,0,1,1
|
||||
40020008,4002,No Time Like the Present,2,200003,40020008,3,4,4257,3869,5030,04002_0008_00,04002_0008_01,3,,,4,0,1000,1,223121515
|
||||
40030001,4003,Choreographer,1,100001,40030001,1,2,4048,2917,3035,04003_0001_00,04003_0001_01,1,,,1,0,0,1,1
|
||||
40030002,4003,Love for Round Things,2,200001,40030002,1,2,3293,3093,3614,04003_0002_00,04003_0002_01,1,,,1,0,0,1,1
|
||||
40030003,4003,Surprises at Home,3,300001,40030003,1,2,3063,3804,3133,04003_0003_00,04003_0003_01,1,,,1,0,0,1,1
|
||||
40030004,4003,Let's Dance Together,1,100002,40030004,2,3,4463,3354,3683,04003_0004_00,04003_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40030005,4003,Wanna Eat Takoyaki?,2,200002,40030005,2,3,3643,3326,4531,04003_0005_00,04003_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40030006,4003,Carefree Greetings,3,300002,40030006,2,3,3418,4471,3611,04003_0006_00,04003_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40030007,4003,Veteran Steps,2,200004,40030007,3,4,3777,4028,5195,04003_0007_00,04003_0007_01,3,,,1,40030007,0,1,1
|
||||
40030008,4003,Fortune Visits Those Who Smile,1,100003,40030008,3,4,5066,3865,4225,04003_0008_00,04003_0008_01,3,,,4,0,1000,1,223121515
|
||||
40040001,4004,The Showbiz Spirit,1,100001,40040001,1,2,3936,2971,3093,04004_0001_00,04004_0001_01,1,,,1,0,0,1,1
|
||||
40040002,4004,A Real Wild Card,2,200001,40040002,1,2,3114,3134,3752,04004_0002_00,04004_0002_01,1,,,1,0,0,1,1
|
||||
40040003,4004,A Toast at Home☆,3,300001,40040003,1,2,2985,3636,3379,04004_0003_00,04004_0003_01,1,,,1,0,0,1,1
|
||||
40040004,4004,Galaxy!,1,100002,40040004,2,3,4628,3340,3532,04004_0004_00,04004_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40040005,4004,Back to Center Stage,2,200002,40040005,2,3,3544,3800,4156,04004_0005_00,04004_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40040006,4004,Walking in Platform Shoes!,3,300002,40040006,2,3,3597,4267,3636,04004_0006_00,04004_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40040007,4004,Two Armfuls,1,100004,40040007,3,4,5052,3842,4106,04004_0007_00,04004_0007_01,3,,,1,40040007,0,1,1
|
||||
40040008,4004,Faith Moves Mountains,2,200003,40040008,3,4,4045,4057,5054,04004_0008_00,04004_0008_01,3,,,4,0,1000,1,223121515
|
||||
40050001,4005,Honor Student,1,100001,40050001,1,2,3664,3305,3031,04005_0001_00,04005_0001_01,1,,,1,0,0,1,1
|
||||
40050002,4005,Young Miss,2,200001,40050002,1,2,3249,2907,3844,04005_0002_00,04005_0002_01,1,,,1,0,0,1,1
|
||||
40050003,4005,Decorating Home,3,300001,40050003,1,2,3146,4034,2820,04005_0003_00,04005_0003_01,1,,,1,0,0,1,1
|
||||
40050004,4005,Diligent Effort,1,100002,40050004,2,3,4248,3512,3740,04005_0004_00,04005_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40050005,4005,An Example to All,2,200002,40050005,2,3,3644,3547,4309,04005_0005_00,04005_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40050006,4005,Leisure Outfit,3,300002,40050006,2,3,3454,4206,3840,04005_0006_00,04005_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40050007,4005,Mother's Yuigaoka,3,300004,40050007,3,4,3878,4947,4175,04005_0007_00,04005_0007_01,3,,,1,40050007,0,1,1
|
||||
40050008,4005,Never Forget Your Roots,1,100003,40050008,3,4,5072,3977,4107,04005_0008_00,04005_0008_01,3,,,4,0,1000,1,223121515
|
||||
40060001,4006,From the Far North,1,100001,40060001,1,2,3817,2979,3204,04006_0001_00,04006_0001_01,1,,,1,0,0,1,1
|
||||
40060002,4006,Genial and Generous,2,200001,40060002,1,2,3150,3244,3606,04006_0002_00,04006_0002_01,1,,,1,0,0,1,1
|
||||
40060003,4006,Relaxing at Home,3,300001,40060003,1,2,3032,3913,3055,04006_0003_00,04006_0003_01,1,,,1,0,0,1,1
|
||||
40060004,4006,Aiming to Shine,1,100002,40060004,2,3,4429,3552,3519,04006_0004_00,04006_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40060005,4006,I'm Going for It!,2,200002,40060005,2,3,3441,3772,4287,04006_0005_00,04006_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40060006,4006,Let's Get Girly,3,300002,40060006,2,3,3857,4152,3491,04006_0006_00,04006_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40060007,4006,230m above Ground,2,200004,40060007,3,4,4042,4197,4761,04006_0007_00,04006_0007_01,3,,,1,40060007,0,1,1
|
||||
40060008,4006,If At First You Don’t Succeed,3,300003,40060008,3,4,3943,5028,4185,04006_0008_00,04006_0008_01,3,,,4,0,1000,1,223121515
|
||||
40070001,4007,I Wanna Try!,1,100001,40070001,1,2,3683,3061,3256,04007_0001_00,04007_0001_01,1,,,1,0,0,1,1
|
||||
40070002,4007,With the Seasons,2,200001,40070002,1,2,2910,3289,3801,04007_0002_00,04007_0002_01,1,,,1,0,0,1,1
|
||||
40070003,4007,House Party!,3,300001,40070003,1,2,3268,3856,2876,04007_0003_00,04007_0003_01,1,,,1,0,0,1,1
|
||||
40070004,4007,Please Cheer Me On...,1,100002,40070004,2,3,4391,3371,3738,04007_0004_00,04007_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40070005,4007,Following My Dreams,2,200002,40070005,2,3,3604,3240,4656,04007_0005_00,04007_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40070006,4007,Looking Cool,3,300002,40070006,2,3,3351,4408,3741,04007_0006_00,04007_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40070007,4007,Almost Complete,1,100004,40070007,3,4,4976,3847,4177,04007_0007_00,04007_0007_01,3,,,1,40070007,0,1,1
|
||||
40070008,4007,With All Your Might,2,200003,40070008,3,4,3943,4169,5044,04007_0008_00,04007_0008_01,3,,,4,0,1000,1,223121515
|
||||
40080001,4008,Science Club Member,1,100001,40080001,1,2,3649,3262,3089,04008_0001_00,04008_0001_01,1,,,1,0,0,1,1
|
||||
40080002,4008,With Mei,2,200001,40080002,1,2,3055,3289,3656,04008_0002_00,04008_0002_01,1,,,1,0,0,1,1
|
||||
40080003,4008,Chilling at Home,3,300001,40080003,1,2,3043,3887,3070,04008_0003_00,04008_0003_01,1,,,1,0,0,1,1
|
||||
40080004,4008,Cool and Mysterious,1,100002,40080004,2,3,4476,3384,3640,04008_0004_00,04008_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40080005,4008,Lively's Not So Bad,2,200002,40080005,2,3,3557,3490,4453,04008_0005_00,04008_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40080006,4008,I Make This Look Good,3,300002,40080006,2,3,3249,4671,3580,04008_0006_00,04008_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40080007,4008,After School Science,3,300004,40080007,3,4,4095,4736,4169,04008_0007_00,04008_0007_01,3,,,1,40080007,0,1,1
|
||||
40080008,4008,Silence Is Golden,1,100003,40080008,3,4,5046,3930,4180,04008_0008_00,04008_0008_01,3,,,4,0,1000,1,223121515
|
||||
40090001,4009,Oni-Supplement,1,100001,40090001,1,2,3728,3040,3232,04009_0001_00,04009_0001_01,1,,,1,0,0,1,1
|
||||
40090002,4009,I Smell Money,2,200001,40090002,1,2,2935,3132,3933,04009_0002_00,04009_0002_01,1,,,1,0,0,1,1
|
||||
40090003,4009,Happy Heart at Home,3,300001,40090003,1,2,2953,4064,2983,04009_0003_00,04009_0003_01,1,,,1,0,0,1,1
|
||||
40090004,4009,I'll Fire Them Up!,1,100002,40090004,2,3,4321,3495,3684,04009_0004_00,04009_0004_01,2,b_card_0084,b_st_0004,1,0,0,1,1
|
||||
40090005,4009,Newfound Dream,2,200002,40090005,2,3,3571,3252,4677,04009_0005_00,04009_0005_01,2,b_card_0073,b_card_0013,1,0,0,1,1
|
||||
40090006,4009,Sweet & Spicy,3,300002,40090006,2,3,3433,4638,3429,04009_0006_00,04009_0006_01,2,b_card_0082,b_card_0083,1,0,0,1,1
|
||||
40090007,4009,OniNatsu Live Stream!,2,200004,40090007,3,4,4062,4208,4730,04009_0007_00,04009_0007_01,3,,,1,40090007,0,1,1
|
||||
40090008,4009,Ends Justify Means,3,300003,40090008,3,4,4194,4951,4011,04009_0008_00,04009_0008_01,3,,,4,0,1000,1,223121515
|
||||
10010015,1001,Miracle Live!,2,200003,10010015,3,4,3804,3883,4663,01001_0015_00,01001_0015_01,3,,,0,10010015,0,1,1
|
||||
20010013,2001,Miracle Live☆,3,300003,20010013,3,4,3725,4594,4031,02001_0013_00,02001_0013_01,3,,,0,20010013,0,1,1
|
||||
30010009,3001,Miracle Live♡,1,100003,30010009,3,4,4907,3824,3619,03001_0009_00,03001_0009_01,3,,,0,30010009,0,1,1
|
||||
40010009,4001,Miracle Live♪,2,200003,40010009,3,4,3771,3851,4728,04001_0009_00,04001_0009_01,3,,,0,40010009,0,1,1
|
||||
40090009,4009,Time for a Lecture,1,100004,40090009,3,4,5012,4062,3952,04009_0009_00,04009_0009_01,3,,,1,40090009,0,1,223041902
|
||||
40020009,4002,Swirling Ice Cream,1,100008,40020009,3,4,4727,4157,4142,04002_0009_00,04002_0009_01,3,,,1,40020009,0,1,223041902
|
||||
40030009,4003,Cheer Up!,1,100003,40030009,3,4,5135,3771,4120,04003_0009_00,04003_0009_01,3,,,2,40030009,0,1,223041904
|
||||
10010016,1001,Sports Drink,3,300004,10010016,3,4,4315,4740,3971,01001_0016_00,01001_0016_01,3,,,1,10010016,0,1,223043003
|
||||
10020015,1002,New! Animal Cookie,3,300005,10020015,3,4,4000,4929,4097,01002_0015_00,01002_0015_01,3,,,1,10020015,0,1,223043003
|
||||
10090015,1009,µ's and Me,3,300003,10090015,3,4,4011,4792,4223,01009_0015_00,01009_0015_01,3,,,2,10090015,0,1,223043005
|
||||
20010014,2001,Trying on Glasses,2,200004,20010014,3,4,4071,3879,5076,02001_0014_00,02001_0014_01,3,,,1,20010014,0,1,223051503
|
||||
20020013,2002,Take a Bite,2,200006,20020013,3,4,3827,4045,5154,02002_0013_00,02002_0013_01,3,,,1,20020013,0,1,223051503
|
||||
20070013,2007,Having a Snack Downtown,2,200003,20070013,3,4,4095,3842,5089,02007_0013_00,02007_0013_01,3,,,2,20070013,0,1,223051505
|
||||
40010010,4001,Lovely Apple Pie,3,300004,40010010,3,4,4150,4716,4160,04001_0010_00,04001_0010_01,3,,,1,40010010,0,1,223050104
|
||||
30050009,3005,Surprise BBQ,2,200004,30050009,3,4,3980,4047,4999,03005_0009_00,03005_0009_01,3,,,1,30050009,0,1,223053002
|
||||
30060009,3006,Catching Some Zzz's,3,300004,30060009,3,4,3789,5356,3907,03006_0009_00,03006_0009_01,3,,,1,30060009,0,1,223053103
|
||||
30080009,3008,Healing Voice Echoes in the Air,3,300007,30080009,3,4,3802,5307,3943,03008_0009_00,03008_0009_01,3,,,1,30080009,0,1,223053103
|
||||
30090009,3009,Super Intense Live Show,3,300003,30090009,3,4,3878,4963,4211,03009_0009_00,03009_0009_01,3,,,1,30090009,0,1,223053105
|
||||
20030013,2003,I Love this Ocean,1,100004,20030013,3,4,5216,4045,3791,02003_0013_00,02003_0013_01,3,,,1,20030013,0,1,223061503
|
||||
20040013,2004,Shell Float,1,100006,20040013,3,4,5226,3853,3973,02004_0013_00,02004_0013_01,3,,,1,20040013,0,1,223061503
|
||||
20090013,2009,Unbreakable Watermelon,1,100003,20090013,3,4,4937,4042,4073,02009_0013_00,02009_0013_01,3,,,1,20090013,0,1,223061505
|
||||
10070015,1007,Rainy Birthday,3,300004,10070015,3,4,4021,5262,3769,01007_0015_00,01007_0015_01,3,,,1,10070015,0,1,223060902
|
||||
20080013,2008,Hydrangea After Rain,1,100004,20080013,3,4,5251,3817,3984,02008_0013_00,02008_0013_01,3,,,1,20080013,0,1,223061302
|
||||
40080009,4008,Stag Beetle Cake,1,100004,40080009,3,4,5266,4048,3738,04008_0009_00,04008_0009_01,3,,,1,40080009,0,1,223061702
|
||||
30040009,3004,Morning Surprise!,2,200004,30040009,3,4,3993,3748,5311,03004_0009_00,03004_0009_01,3,,,1,30040009,0,1,223062902
|
||||
10070016,1007,I'll See You in Umeda,1,100003,10070016,3,4,4492,3993,3865,01007_0016_00,01007_0016_01,3,,,0,0,1988,1,223070703
|
||||
40040009,4004,Like a Hollywood Star,2,200008,40040009,3,4,3839,3880,5359,04004_0009_00,04004_0009_01,3,,,1,40040009,0,1,223063003
|
||||
40050009,4005,Summertime Beach Volleyball,2,200004,40050009,3,4,4044,3734,5300,04005_0009_00,04005_0009_01,3,,,1,40050009,0,1,223063003
|
||||
40060010,4006,High Waves Surprise,2,200003,40060010,3,4,4185,3987,4906,04006_0010_00,04006_0010_01,3,,,2,40060010,0,1,223063005
|
||||
30010010,3001,Poolside Break,2,200004,30010010,3,4,3805,3990,5283,03001_0010_00,03001_0010_01,3,,,1,30010010,0,1,223071504
|
||||
30100009,3010,Waterslide,2,200007,30100009,3,4,3994,3831,5253,03010_0009_00,03010_0009_01,3,,,1,30100009,0,1,223071504
|
||||
30020009,3002,Lurking Under the Sea,2,200003,30020009,3,4,4015,4346,4717,03002_0009_00,03002_0009_01,3,,,2,30020009,0,1,223071506
|
||||
20060014,2006,With Gratitude,1,100004,20060014,3,4,5318,3847,3913,02006_0014_00,02006_0014_01,3,,,1,20060014,0,1,223071302
|
||||
40020010,4002,Sunny Passion Surprise,3,300004,40020010,3,4,4014,5273,3791,04002_0010_00,04002_0010_01,3,,,1,40020010,0,1,223071703
|
||||
40020012,4002,A Tree of Snow and Ice,2,200008,40020012,3,4,3871,3958,5483,04002_0012_00,04002_0012_01,3,,,1,40020012,0,1,223121506
|
||||
40020014,4002,It's Cooking!,3,300003,40020014,2,3,3446,4969,3315,04002_0014_00,04002_0014_01,2,,,4,0,0,1,224020102
|
||||
10090016,1009,Echoes of a Stationfront Duet,1,100004,10090016,3,4,5352,3713,4013,01009_0016_00,01009_0016_01,3,,,1,10090016,0,1,223072202
|
||||
10030016,1003,Close to Summer's End...,1,100004,10030016,3,4,5223,3949,3932,01003_0016_00,01003_0016_01,3,,,1,10030016,0,1,223073103
|
||||
10050015,1005,Big Wave Surfin',1,100005,10050015,3,4,5335,3940,3829,01005_0015_00,01005_0015_01,3,,,1,10050015,0,1,223073103
|
||||
10040016,1004,Beach Races,1,100003,10040016,3,4,4796,4297,4011,01004_0016_00,01004_0016_01,3,,,2,10040016,0,1,223073105
|
||||
40070010,4007,Festival Games,3,300004,40070010,3,4,3944,5291,3869,04007_0010_00,04007_0010_01,3,,,1,40070010,0,1,223081503
|
||||
40080010,4008,Bullseye for Mei,3,300008,40080010,3,4,3817,5353,3934,04008_0010_00,04008_0010_01,3,,,1,40080010,0,1,223081503
|
||||
40080011,4008,From a Prehistoric World,2,200003,40080011,3,4,4051,4223,5038,04008_0011_00,04008_0011_01,3,,,2,40080011,0,1,223121509
|
||||
40080013,4008,Taste Tester Wanted,3,300003,40080013,2,3,3376,4980,3374,04008_0013_00,04008_0013_01,2,,,4,0,0,1,224020102
|
||||
40010011,4001,Evening Flower Buds,3,300003,40010011,3,4,4257,4819,4028,04001_0011_00,04001_0011_01,3,,,2,40010011,0,1,223081505
|
||||
20010015,2001,Cozy Bus Ride,3,300004,20010015,3,4,3852,5180,4072,02001_0015_00,02001_0015_01,3,,,1,20010015,0,1,223080103
|
||||
10010017,1001,Letter from a Childhood Friend,2,200004,10010017,3,4,3908,3962,5234,01001_0017_00,01001_0017_01,3,,,1,10010017,0,1,223080304
|
||||
40090010,4009,Cradled by the Trunk,3,300004,40090010,3,4,4020,5372,3712,04009_0010_00,04009_0010_01,3,,,1,40090010,0,1,223080702
|
||||
30070009,3007,Anime Song Karaoke Party,2,200004,30070009,3,4,3708,4024,5372,03007_0009_00,03007_0009_01,3,,,1,30070009,0,1,223080802
|
||||
20060015,2006,Where Darkness Gathers,3,300004,20060015,3,4,3752,5304,4074,02006_0015_00,02006_0015_01,3,,,1,20060015,0,1,223083103
|
||||
20060016,2006,Overenthusiastic Exorcist,2,200019,20060016,3,4,3916,3965,5587,02006_0016_00,02006_0016_01,3,,,1,20060016,0,1,224021403
|
||||
20060017,2006,What Should I Do?!,1,100004,20060017,3,4,5118,4096,4254,02006_0017_00,02006_0017_01,3,,,4,0,1000,1,224020903
|
||||
20080014,2008,Gazing at the Distant Moon,3,300006,20080014,3,4,3801,5367,3962,02008_0014_00,02008_0014_01,3,,,1,20080014,0,1,223083103
|
||||
20080016,2008,Super Luxury Ehomaki,2,200003,20080016,3,4,4343,4006,5119,02008_0016_00,02008_0016_01,3,,,2,20080016,0,1,224021406
|
||||
20050014,2005,Rustling Silvergrass,3,300003,20050014,3,4,4219,5004,3907,02005_0014_00,02005_0014_01,3,,,2,20050014,0,1,223083105
|
||||
10060015,1006,Refreshing Evening,2,200004,10060015,3,4,4023,3728,5379,01006_0015_00,01006_0015_01,3,,,1,10060015,0,1,223091503
|
||||
10060017,1006,On the Snowy Rink,3,300005,10060017,3,4,3940,5506,3944,01006_0017_00,01006_0017_01,3,,,1,10060017,0,1,224011503
|
||||
10060018,1006,Spring Astronomical Observation,1,100004,10060018,3,4,5599,3940,4007,01006_0018_00,01006_0018_01,3,,,1,10060018,0,1,224031603
|
||||
10070017,1007,Summer Boat to Kanda,2,200005,10070017,3,4,3895,3871,5364,01007_0017_00,01007_0017_01,3,,,1,10070017,0,1,223091503
|
||||
10080016,1008,How Many Plates Can we Eat?,2,200003,10080016,3,4,4136,4115,4879,01008_0016_00,01008_0016_01,3,,,2,10080016,0,1,223091505
|
||||
10080017,1008,A Reason to Be Excited,1,100004,10080017,3,4,5527,4042,3821,01008_0017_00,01008_0017_01,3,,,1,10080017,0,1,224011703
|
||||
10030017,1003,Costume Photoshoot ♡,1,100004,10030017,3,4,5361,4059,3710,01003_0017_00,01003_0017_01,3,,,1,10030017,0,1,223091202
|
||||
10030018,1003,"Ah, I Slipped!",3,300019,10030018,3,4,4001,5543,3846,01003_0018_00,01003_0018_01,3,,,1,10030018,0,1,224011503
|
||||
20020014,2002,Flying Seagulls,1,100004,20020014,3,4,5379,3745,4006,02002_0014_00,02002_0014_01,3,,,1,20020014,0,1,223091902
|
||||
20020016,2002,Making Demon Masks,2,200004,20020016,3,4,3920,3976,5572,02002_0016_00,02002_0016_01,3,,,1,20020016,0,1,224021403
|
||||
20090014,2009,Fresh Autumn Sweets,3,300004,20090014,3,4,3835,5221,4074,02009_0014_00,02009_0014_01,3,,,1,20090014,0,1,223092102
|
||||
20090016,2009,With the Penguins,1,100006,20090016,3,4,5529,3779,4082,02009_0016_00,02009_0016_01,3,,,1,20090016,0,1,223123103
|
||||
40040010,4004,Mesmerized by Melons ♡,3,300004,40040010,3,4,3873,5252,4005,04004_0010_00,04004_0010_01,3,,,1,40040010,0,1,223092802
|
||||
40040012,4004,Want Me to Feed You?,1,100003,40040012,2,3,5019,3354,3357,04004_0012_00,04004_0012_01,2,,,4,0,0,1,224020102
|
||||
40040013,4004,Can't Be Honest,3,300003,40040013,3,4,4018,5149,4379,04004_0013_00,04004_0013_01,3,,,2,40040013,0,1,224030106
|
||||
30120010,3012,Halloween Afternoon,1,100004,30120010,3,4,5384,3849,3923,03012_0010_00,03012_0010_01,3,,,1,30120010,0,1,223093003
|
||||
30110010,3011,Halloween Surprise,1,100007,30110010,3,4,5390,3738,4028,03011_0010_00,03011_0010_01,3,,,1,30110010,0,1,223093003
|
||||
30030010,3003,Secret Plan,1,100003,30030010,3,4,5006,3975,4175,03003_0010_00,03003_0010_01,3,,,2,30030010,0,1,223093005
|
||||
20070015,2007,Flower Park,3,300019,20070015,3,4,3960,5500,3696,02007_0015_00,02007_0015_01,3,,,1,20070015,0,1,223101507
|
||||
20070016,2007,Impressive VR Experience,2,200004,20070016,3,4,4100,3852,5594,02007_0016_00,02007_0016_01,3,,,1,20070016,0,1,224030403
|
||||
20040015,2004,The World is Upside-Down,3,300021,20040015,3,4,3690,5500,3966,02004_0015_00,02004_0015_01,3,,,1,20040015,0,1,223101507
|
||||
20040016,2004,Wish on the Ema,2,200004,20040016,3,4,4134,3756,5500,02004_0016_00,02004_0016_01,3,,,1,20040016,0,1,224010104
|
||||
20030015,2003,Haunted House,3,300003,20030015,3,4,3970,5050,4136,02003_0015_00,02003_0015_01,3,,,2,20030015,0,1,223101509
|
||||
20030016,2003,Special Teatime,3,300004,20030016,3,4,3988,5577,3903,02003_0016_00,02003_0016_01,3,,,1,20030016,0,1,224021005
|
||||
30100010,3010,Spending Time with My Sister,1,100004,30100010,3,4,5344,3751,4061,03010_0010_00,03010_0010_01,3,,,1,30100010,0,1,223100503
|
||||
10020017,1002,New Hairstyle,2,200004,10020017,3,4,3771,4009,5376,01002_0017_00,01002_0017_01,3,,,1,10020017,0,1,223102102
|
||||
10020018,1002,Forever Smiling,1,100004,10020018,3,4,5150,4243,4075,01002_0018_00,01002_0018_01,3,,,4,0,1000,1,224020903
|
||||
40070011,4007,A Day at the Cat Cafe,2,200004,40070011,3,4,3887,3885,5384,04007_0011_00,04007_0011_01,3,,,1,40070011,0,1,223102902
|
||||
40070012,4007,Came Out Great,1,100003,40070012,2,3,4995,3298,3437,04007_0012_00,04007_0012_01,2,,,4,0,0,1,224020102
|
||||
40070013,4007,Snacks for Our Seniors,3,300004,40070013,3,4,3780,5610,4156,04007_0013_00,04007_0013_01,3,,,1,40070013,0,1,224030103
|
||||
10040017,1004,With You to Wherever,3,300003,10040017,2,3,3300,4744,3594,01004_0017_00,01004_0017_01,2,,,3,10040017,0,1,223100504
|
||||
20050015,2005,"Adventure, Aye Aye!",1,100003,20050015,2,3,4732,3255,3651,02005_0015_00,02005_0015_01,2,b_card_0086,b_card_0086,1,20050015,0,1,223101504
|
||||
30070011,3007,The Great Adventure Begins,3,300003,30070011,2,3,3409,4693,3536,03007_0011_00,03007_0011_01,2,b_card_0086,b_card_0086,1,30070011,0,1,223101504
|
||||
40030011,4003,To Sights Yet Unseen,2,200003,40030011,2,3,3632,3236,4770,04003_0011_00,04003_0011_01,2,b_card_0086,b_card_0086,1,40030011,0,1,223101504
|
||||
30010011,3001,Walking Together With You,2,200003,30010011,3,4,3919,3986,5251,03001_0011_00,03001_0011_01,3,,,4,0,1000,1,223101503
|
||||
30020010,3002,Super Sweet Cutie Girl,3,300003,30020010,3,4,4300,4925,3931,03002_0010_00,03002_0010_01,3,,,4,0,1000,1,223101503
|
||||
30030011,3003,In the Springtime of Life,1,100003,30030011,3,4,4774,4211,4171,03003_0011_00,03003_0011_01,3,,,4,0,1000,1,223101503
|
||||
30040010,3004,Cool Beauty,2,200003,30040010,3,4,4248,4027,4881,03004_0010_00,03004_0010_01,3,,,4,0,1000,1,223101503
|
||||
30050011,3005,"""i"" Love You",3,300003,30050011,3,4,4111,5111,3934,03005_0011_00,03005_0011_01,3,,,4,0,1000,1,223101503
|
||||
30060010,3006,Nap and a Show,1,100003,30060010,3,4,5040,4256,3860,03006_0010_00,03006_0010_01,3,,,4,0,1000,1,223101503
|
||||
30070012,3007,Professing My Love!,2,200003,30070012,3,4,4119,4236,4801,03007_0012_00,03007_0012_01,3,,,4,0,1000,1,223101503
|
||||
30080010,3008,Singing a Comforting Song,3,300003,30080010,3,4,3852,5220,4084,03008_0010_00,03008_0010_01,3,,,4,0,1000,1,223101503
|
||||
30090011,3009,Connecting with Fans,1,100003,30090011,3,4,4833,4091,4232,03009_0011_00,03009_0011_01,3,,,4,0,1000,1,223101503
|
||||
30100011,3010,Gifted with Aptitude,2,200003,30100011,3,4,3888,4113,5155,03010_0011_00,03010_0011_01,3,,,4,0,1000,1,223101503
|
||||
30100012,3010,Time to Get to Work,3,300003,30100012,2,3,3465,4781,3415,03010_0012_00,03010_0012_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30110011,3011,Reach for My Dreams,3,300003,30110011,3,4,4074,4823,4259,03011_0011_00,03011_0011_01,3,,,4,0,1000,1,223101503
|
||||
30110012,3011,"Let’s Go, Baby!",2,200003,30110012,2,3,3549,3317,4795,03011_0012_00,03011_0012_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30120011,3012,As a Part of the Club,1,100003,30120011,3,4,5224,4149,3783,03012_0011_00,03012_0011_01,3,,,4,0,1000,1,223101503
|
||||
30120012,3012,Lanzhu’s the Boss!,2,200003,30120012,2,3,3562,3308,4791,03012_0012_00,03012_0012_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30120013,3012,The Best Love!,3,300004,30120013,3,4,3957,5205,3994,03012_0013_00,03012_0013_01,3,,,1,30120013,1000,1,223121902
|
||||
30120014,3012,On a Flying Trapeze,2,200004,30120014,3,4,4116,3787,5565,03012_0014_00,03012_0014_01,3,,,1,30120014,0,1,224021503
|
||||
30010012,3001,Gazing at You,3,300004,30010012,3,4,3810,5201,4145,03001_0012_00,03001_0012_01,3,,,1,30010012,1000,1,223100302
|
||||
30020011,3002,Grown-up Date ♡,3,300004,30020011,3,4,4005,5220,3931,03002_0011_00,03002_0011_01,3,,,1,30020011,1000,1,223101002
|
||||
30020013,3002,Formal Kasumin,2,200003,30020013,2,3,3285,3628,4748,03002_0013_00,03002_0013_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30020014,3002,Makeup Kasumin,3,300004,30020014,3,4,3955,5536,3899,03002_0014_00,03002_0014_01,3,,,1,30020014,0,1,224012303
|
||||
30030012,3003,Flirty Attitude,2,200004,30030012,3,4,3918,3966,5272,03003_0012_00,03003_0012_01,3,,,1,30030012,1000,1,223101702
|
||||
30030013,3003,Acting Like an Adult,3,300003,30030013,2,3,3368,4775,3518,03003_0013_00,03003_0013_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30030014,3003,Some Help from Ophelia,2,200019,30030014,3,4,3838,4052,5578,03003_0014_00,03003_0014_01,3,,,1,30030014,0,1,224013103
|
||||
30030015,3003,Two of are Heroes☆,3,300004,30030015,3,4,4075,5591,3880,03003_0015_00,03003_0015_01,3,,,1,30030015,0,1,224031603
|
||||
30040011,3004,Searching for a Special Love,3,300004,30040011,3,4,3804,5222,4130,03004_0011_00,03004_0011_01,3,,,1,30040011,1000,1,223102402
|
||||
30050012,3005,Fun with the Two of Us,2,200004,30050012,3,4,3991,3965,5200,03005_0012_00,03005_0012_01,3,,,1,30050012,1000,1,223103102
|
||||
40030012,4003,After Party,1,100019,40030012,3,4,5433,4023,3778,04003_0012_00,04003_0012_01,3,,,1,40030012,0,1,223103109
|
||||
40060011,4006,Offstage Nerves,1,100008,40060011,3,4,5428,3792,4014,04006_0011_00,04006_0011_01,3,,,1,40060011,0,1,223103109
|
||||
40060012,4006,My Tastebuds Are Tingling,1,100003,40060012,2,3,4959,3402,3369,04006_0012_00,04006_0012_01,2,,,4,0,0,1,224020102
|
||||
40060013,4006,Tokyo French Fries,3,300004,40060013,3,4,4036,5602,3908,04006_0013_00,04006_0013_01,3,,,1,40060013,0,1,224031603
|
||||
40090011,4009,Natural Informant,1,100003,40090011,3,4,4999,4108,4127,04009_0011_00,04009_0011_01,3,,,2,40090011,0,1,223103106
|
||||
40090013,4009,My Special Smoothie,2,200003,40090013,2,3,3419,3333,4978,04009_0013_00,04009_0013_01,2,,,4,0,0,1,224020102
|
||||
40100001,4010,Overwhelming Musical Sense,1,100002,40100001,2,3,4732,3467,3485,04010_0001_00,04010_0001_01,2,,,1,0,0,1,223121510
|
||||
40100002,4010,Duet,2,200004,40100002,3,4,3878,3965,5547,04010_0002_00,04010_0002_01,3,,,1,40100002,0,1,224012003
|
||||
40100003,4010,Made with All My Heart,3,300003,40100003,2,3,3357,5016,3357,04010_0003_00,04010_0003_01,2,,,4,0,0,1,224020102
|
||||
40110001,4011,Rigid Analysis,1,100002,40110001,2,3,4687,3307,3690,04011_0001_00,04011_0001_01,2,,,1,0,0,1,223121510
|
||||
40110002,4011,Jellyfish,3,300004,40110002,3,4,3953,5489,3870,04011_0002_00,04011_0002_01,3,,,1,40110002,0,1,223122802
|
||||
40110003,4011,Cooked Efficiently,2,200003,40110003,2,3,3442,3270,5018,04011_0003_00,04011_0003_01,2,,,4,0,0,1,224020102
|
||||
30070013,3007,Band of Volunteers,3,300019,30070013,3,4,3929,5441,3864,03007_0013_00,03007_0013_01,3,,,1,30070013,0,1,223111503
|
||||
30050013,3005,Food Stall Crawl,3,300007,30050013,3,4,3850,5435,3949,03005_0013_00,03005_0013_01,3,,,1,30050013,0,1,223111503
|
||||
30050014,3005,I'll Manage to Manage!,1,100003,30050014,2,3,4797,3422,3442,03005_0014_00,03005_0014_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30040012,3004,Ace of the Butler Cafe,3,300003,30040012,3,4,3972,4949,4313,03004_0012_00,03004_0012_01,3,,,2,30040012,0,1,223111506
|
||||
30040013,3004,Working in Style,1,100003,30040013,2,3,4787,3458,3416,03004_0013_00,03004_0013_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30040014,3004,Experiments in Chocolate,2,200004,30040014,3,4,3995,3912,5561,03004_0014_00,03004_0014_01,3,,,1,30040014,0,1,224013103
|
||||
10050016,1005,Delivering a Bundle of Cuteness,2,200004,10050016,3,4,3853,3939,5442,01005_0016_00,01005_0016_01,3,,,1,10050016,0,1,223110102
|
||||
10050018,1005,You Can Count on Me!,3,300003,10050018,3,4,4319,5049,4022,01005_0018_00,01005_0018_01,3,,,2,10050018,0,1,224011506
|
||||
30090012,3009,FULL COMBO!,1,100004,30090012,3,4,5439,3905,3890,03009_0012_00,03009_0012_01,3,,,1,30090012,0,1,223111302
|
||||
40050011,4005,Strawberry Dessert Buffet,1,100004,40050011,3,4,5438,3751,4045,04005_0011_00,04005_0011_01,3,,,1,40050011,0,1,223112402
|
||||
40050012,4005,Here You Are,2,200003,40050012,2,3,3239,3489,5002,04005_0012_00,04005_0012_01,2,,,4,0,0,1,224020102
|
||||
40050013,4005,Filled with My Gratitude,3,300019,40050013,3,4,3954,5607,3985,04005_0013_00,04005_0013_01,3,,,1,40050013,0,1,224030103
|
||||
30060011,3006,"You, Forever, Always",2,200004,30060011,3,4,4048,3903,5205,03006_0011_00,03006_0011_01,3,,,1,30060011,1000,1,223110702
|
||||
30060012,3006,Some Work Before Snoozing,3,300003,30060012,2,3,3405,4746,3510,03006_0012_00,03006_0012_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30060013,3006,Irresistable Kotatsu,1,100004,30060013,3,4,5486,3992,3834,03006_0013_00,03006_0013_01,3,,,1,30060013,0,1,223121602
|
||||
30070014,3007,Let This Love Reach Everyone,1,100004,30070014,3,4,5201,3892,4063,03007_0014_00,03007_0014_01,3,,,1,30070014,1000,1,223111402
|
||||
30080011,3008,My Memories of You,1,100004,30080011,3,4,5242,3847,4067,03008_0011_00,03008_0011_01,3,,,1,30080011,1000,1,223112102
|
||||
30080012,3008,Do I Look Cool?,2,200003,30080012,2,3,3563,3352,4746,03008_0012_00,03008_0012_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
30080014,3008,Always Room for More Bread,2,200004,30080014,3,4,3770,4122,5576,03008_0014_00,03008_0014_01,3,,,1,30080014,0,1,224020503
|
||||
30090013,3009,To My Special You,2,200004,30090013,3,4,4000,3949,5207,03009_0013_00,03009_0013_01,3,,,1,30090013,1000,1,223112802
|
||||
30090014,3009,A Different Feel,3,300003,30090014,2,3,3414,4742,3505,03009_0014_00,03009_0014_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
10040018,1004,Giving Ai to You,1,100003,10040018,2,3,4684,3595,3359,01004_0018_00,01004_0018_01,2,,,0,0,1000,1,223103001
|
||||
20050016,2005,It's Going to be Fun!,2,200003,20050016,2,3,3671,3289,4678,02005_0016_00,02005_0016_01,2,,,0,0,1000,1,223103001
|
||||
20050017,2005,Osechi and Special Stewshine,1,100019,20050017,3,4,5527,4126,3737,02005_0017_00,02005_0017_01,3,,,1,20050017,0,1,223123103
|
||||
20050019,2005,Re-photographed at a Memorable Place,2,200004,20050019,3,4,4045,3882,5619,02005_0019_00,02005_0019_01,3,,,1,20050019,0,1,224031603
|
||||
30070015,3007,Here We Go!,2,200003,30070015,2,3,3517,3375,4746,03007_0015_00,03007_0015_01,2,,,0,0,1000,1,223103001
|
||||
30070016,3007,Let's Stay Sharp,3,300003,30070016,2,3,3556,4792,3313,03007_0016_00,03007_0016_01,2,b_card_0092,b_card_0092,0,0,1000,1,224011105
|
||||
40030013,4003,"Ready, Set, Okay ♪",3,300003,40030013,2,3,3531,4678,3429,04003_0013_00,04003_0013_01,2,,,0,0,1000,1,223103001
|
||||
40030014,4003,A Day of Circling for Circles,3,300004,40030014,3,4,4020,5587,3861,04003_0014_00,04003_0014_01,3,,,1,40030014,0,1,224022503
|
||||
40030015,4003,Take a Bite,2,200003,40030015,2,3,3448,3279,5003,04003_0015_00,04003_0015_01,2,,,4,0,0,1,224020102
|
||||
10010019,1001,Spring in Full Bloom!,1,100003,10010019,2,3,4781,3540,3340,01001_0019_00,01001_0019_01,2,b_card_0088,b_card_0088,1,0,1000,1,223110103
|
||||
20010017,2001,Scorching Summer Beach,2,200003,20010017,2,3,3516,3420,4725,02001_0017_00,02001_0017_01,2,b_card_0089,b_card_0089,1,0,1000,1,223110103
|
||||
30010013,3001,Long Autumn Nights,3,300003,30010013,2,3,3661,4732,3268,03001_0013_00,03001_0013_01,2,b_card_0090,b_card_0090,1,0,1000,1,223110103
|
||||
40010013,4001,Shimmering Winter Skies,1,100003,40010013,2,3,4667,3454,3540,04001_0013_00,04001_0013_01,2,b_card_0091,b_card_0091,1,0,1000,1,223110103
|
||||
40010014,4001,Posing Together,2,200019,40010014,3,4,4018,3812,5482,04001_0014_00,04001_0014_01,3,,,1,40010014,0,1,223121506
|
||||
30010014,3001,I'm Ready to Go!,1,100003,30010014,2,3,4781,3504,3376,03001_0014_00,03001_0014_01,2,b_card_0092,b_card_0092,0,0,1000,1,223110108
|
||||
10040019,1004,A Very µ's Christmas,2,200019,10040019,3,4,4109,3725,5478,01004_0019_00,01004_0019_01,3,,,1,10040019,0,1,223113010
|
||||
10040020,1004,Smile Spilling Out on the Porch,3,300004,10040020,3,4,3967,5594,3985,01004_0020_00,01004_0020_01,3,,,1,10040020,0,1,224031503
|
||||
10090018,1009,Preparing the Feast,2,200005,10090018,3,4,3756,4082,5474,01009_0018_00,01009_0018_01,3,,,1,10090018,0,1,223113010
|
||||
10010020,1001,Winter Stars Above the Trees,2,200003,10010020,3,4,4220,4016,5076,01001_0020_00,01001_0020_01,3,,,2,10010020,0,1,223113006
|
||||
30110013,3011,My Favorite Athlete is in Japan!,3,300004,30110013,3,4,4033,5484,3795,03011_0013_00,03011_0013_01,3,,,1,30110013,0,1,223120602
|
||||
30100013,3010,My Mark,2,200004,30100013,3,4,3840,4110,5206,03010_0013_00,03010_0013_01,3,,,1,30100013,1000,1,223120502
|
||||
30110014,3011,Racing Heart,1,100004,30110014,3,4,5227,4162,3767,03011_0014_00,03011_0014_01,3,,,1,30110014,1000,1,223121202
|
||||
60010001,6001,Fortune Teller Girl,2,200003,60010001,2,3,3545,3296,4843,06001_0001_00,06001_0001_01,2,b_card_0093,b_card_0102,1,60010001,0,1,223121403
|
||||
60020001,6002,Food Stall Peddler,1,100003,60020001,2,3,4992,3395,3297,06002_0001_00,06002_0001_01,2,b_card_0094,b_card_0103,1,60020001,0,1,223121403
|
||||
60030001,6003,Executive Director General,3,300003,60030001,2,3,3463,4974,3247,06003_0001_00,06003_0001_01,2,b_card_0095,b_card_0104,1,60030001,0,1,223121403
|
||||
60040001,6004,Descendant of the Fairy Tribe,2,200003,60040001,2,3,3335,3714,4635,06004_0001_00,06004_0001_01,2,b_card_0096,b_card_0105,1,60040001,0,1,223121403
|
||||
60050001,6005,Ryokan Poster Girl,1,100003,60050001,2,3,4631,3453,3600,06005_0001_00,06005_0001_01,2,b_card_0097,b_card_0106,1,60050001,0,1,223121403
|
||||
60060001,6006,Messenger,3,300003,60060001,2,3,3527,4762,3395,06006_0001_00,06006_0001_01,2,b_card_0098,b_card_0107,1,60060001,0,1,223121403
|
||||
60070001,6007,Mechanic,2,200003,60070001,2,3,3466,3455,4763,06007_0001_00,06007_0001_01,2,b_card_0099,b_card_0108,1,60070001,0,1,223121403
|
||||
60080001,6008,Zoologist,1,100003,60080001,2,3,4824,3466,3394,06008_0001_00,06008_0001_01,2,b_card_0100,b_card_0109,1,60080001,0,1,223121403
|
||||
60090001,6009,Descendant of the Demon King,3,300003,60090001,2,3,3710,4628,3346,06009_0001_00,06009_0001_01,2,b_card_0101,b_card_0110,1,60090001,0,1,223121403
|
||||
20010018,2001,A Lively Town!,1,100003,20010018,2,3,4602,3530,3552,02001_0018_00,02001_0018_01,2,,,0,0,0,1,223120806
|
||||
20010019,2001,First Sunrise from the Sea,1,100003,20010019,3,4,5061,4288,4041,02001_0019_00,02001_0019_01,3,,,2,20010019,0,1,223123106
|
||||
30010015,3001,Onto a New Stage,2,200003,30010015,2,3,3574,3432,4678,03001_0015_00,03001_0015_01,2,,,0,0,0,1,223120906
|
||||
30010017,3001,Open Wide!,2,200003,30010017,3,4,4347,4019,5102,03001_0017_00,03001_0017_01,3,,,2,30010017,0,1,224013106
|
||||
30010018,3001,Trying Out Flower Arranging!,1,100004,30010018,3,4,5610,4010,3926,03001_0018_00,03001_0018_01,3,,,1,30010018,0,1,224030108
|
||||
30010019,3001,Won't You Stay With Me?,1,100004,30010019,3,4,5114,4065,4289,03001_0019_00,03001_0019_01,3,,,4,0,1000,1,224020903
|
||||
40010015,4001,A Hunch of an Encounter,3,300003,40010015,2,3,3436,4683,3565,04001_0015_00,04001_0015_01,2,,,0,0,0,1,223121003
|
||||
40010016,4001,Sorry To Keep You Waiting,1,100003,40010016,2,3,5022,3351,3357,04001_0016_00,04001_0016_01,2,,,4,0,0,1,224020102
|
||||
|
2
src/router/databases/csv-en/card_collection_reward.csv
Normal file
2
src/router/databases/csv-en/card_collection_reward.csv
Normal file
@@ -0,0 +1,2 @@
|
||||
_id,_number,_type,_giveType,_value,_level,_amount,_masterReleaseLabelId
|
||||
310000201,1,1,1,0,0,10,1
|
||||
|
6
src/router/databases/csv-en/card_evolve.csv
Normal file
6
src/router/databases/csv-en/card_evolve.csv
Normal file
@@ -0,0 +1,6 @@
|
||||
_rarity,_evolveCount,_maxLevel,_price,_hpAddValue,_masterReleaseLabelId
|
||||
1,1,60,30000,1,1
|
||||
2,1,80,70000,1,1
|
||||
3,1,100,100000,1,1
|
||||
3,2,120,200000,1,970
|
||||
3,3,140,400000,1,970
|
||||
|
1
src/router/databases/csv-en/card_evolve_condition.csv
Normal file
1
src/router/databases/csv-en/card_evolve_condition.csv
Normal file
@@ -0,0 +1 @@
|
||||
_masterCardId,_evolveCount,_masterReleaseLabelId
|
||||
|
364
src/router/databases/csv-en/card_get.csv
Normal file
364
src/router/databases/csv-en/card_get.csv
Normal file
@@ -0,0 +1,364 @@
|
||||
_masterCardId,_index,_getCategory,_value,_masterReleaseLabelId
|
||||
10010013,1,1,1110001,1
|
||||
10020013,1,1,1110001,1
|
||||
10030013,1,1,1110001,1
|
||||
10040013,1,1,1110001,1
|
||||
10050013,1,1,1110001,1
|
||||
10060013,1,1,1110001,1
|
||||
10070013,1,1,1110001,1
|
||||
10080013,1,1,1110001,1
|
||||
10090013,1,1,1110001,1
|
||||
20010011,1,1,1110001,1
|
||||
20020011,1,1,1110001,1
|
||||
20030011,1,1,1110001,1
|
||||
20040011,1,1,1110001,1
|
||||
20050011,1,1,1110001,1
|
||||
20060011,1,1,1110001,1
|
||||
20070011,1,1,1110001,1
|
||||
20080011,1,1,1110001,1
|
||||
20090011,1,1,1110001,1
|
||||
30010007,1,1,1110001,1
|
||||
30020007,1,1,1110001,1
|
||||
30030007,1,1,1110001,1
|
||||
30040007,1,1,1110001,1
|
||||
30050007,1,1,1110001,1
|
||||
30060007,1,1,1110001,1
|
||||
30070007,1,1,1110001,1
|
||||
30080007,1,1,1110001,1
|
||||
30090007,1,1,1110001,1
|
||||
30100007,1,1,1110001,1
|
||||
30110007,1,1,1110001,1
|
||||
30120007,1,1,1110001,1
|
||||
40010007,1,1,1110001,1
|
||||
40020007,1,1,1110001,1
|
||||
40030007,1,1,1110001,1
|
||||
40040007,1,1,1110001,1
|
||||
40050007,1,1,1110001,1
|
||||
40060007,1,1,1110001,1
|
||||
40070007,1,1,1110001,1
|
||||
40080007,1,1,1110001,1
|
||||
40090007,1,1,1110001,1
|
||||
10010010,1,1,1110001,1
|
||||
10010011,1,1,1110001,1
|
||||
10010012,1,1,1110001,1
|
||||
10020010,1,1,1110001,1
|
||||
10020011,1,1,1110001,1
|
||||
10020012,1,1,1110001,1
|
||||
10030010,1,1,1110001,1
|
||||
10030011,1,1,1110001,1
|
||||
10030012,1,1,1110001,1
|
||||
10040010,1,1,1110001,1
|
||||
10040011,1,1,1110001,1
|
||||
10040012,1,1,1110001,1
|
||||
10050010,1,1,1110001,1
|
||||
10050011,1,1,1110001,1
|
||||
10050012,1,1,1110001,1
|
||||
10060010,1,1,1110001,1
|
||||
10060011,1,1,1110001,1
|
||||
10060012,1,1,1110001,1
|
||||
10070010,1,1,1110001,1
|
||||
10070011,1,1,1110001,1
|
||||
10070012,1,1,1110001,1
|
||||
10080010,1,1,1110001,1
|
||||
10080011,1,1,1110001,1
|
||||
10080012,1,1,1110001,1
|
||||
10090010,1,1,1110001,1
|
||||
10090011,1,1,1110001,1
|
||||
10090012,1,1,1110001,1
|
||||
20010008,1,1,1110001,1
|
||||
20010009,1,1,1110001,1
|
||||
20010010,1,1,1110001,1
|
||||
20020008,1,1,1110001,1
|
||||
20020009,1,1,1110001,1
|
||||
20020010,1,1,1110001,1
|
||||
20030008,1,1,1110001,1
|
||||
20030009,1,1,1110001,1
|
||||
20030010,1,1,1110001,1
|
||||
20040008,1,1,1110001,1
|
||||
20040009,1,1,1110001,1
|
||||
20040010,1,1,1110001,1
|
||||
20050008,1,1,1110001,1
|
||||
20050009,1,1,1110001,1
|
||||
20050010,1,1,1110001,1
|
||||
20060008,1,1,1110001,1
|
||||
20060009,1,1,1110001,1
|
||||
20060010,1,1,1110001,1
|
||||
20070008,1,1,1110001,1
|
||||
20070009,1,1,1110001,1
|
||||
20070010,1,1,1110001,1
|
||||
20080008,1,1,1110001,1
|
||||
20080009,1,1,1110001,1
|
||||
20080010,1,1,1110001,1
|
||||
20090008,1,1,1110001,1
|
||||
20090009,1,1,1110001,1
|
||||
20090010,1,1,1110001,1
|
||||
30010004,1,1,1110001,1
|
||||
30010005,1,1,1110001,1
|
||||
30010006,1,1,1110001,1
|
||||
30020004,1,1,1110001,1
|
||||
30020005,1,1,1110001,1
|
||||
30020006,1,1,1110001,1
|
||||
30030004,1,1,1110001,1
|
||||
30030005,1,1,1110001,1
|
||||
30030006,1,1,1110001,1
|
||||
30040004,1,1,1110001,1
|
||||
30040005,1,1,1110001,1
|
||||
30040006,1,1,1110001,1
|
||||
30050004,1,1,1110001,1
|
||||
30050005,1,1,1110001,1
|
||||
30050006,1,1,1110001,1
|
||||
30060004,1,1,1110001,1
|
||||
30060005,1,1,1110001,1
|
||||
30060006,1,1,1110001,1
|
||||
30070004,1,1,1110001,1
|
||||
30070005,1,1,1110001,1
|
||||
30070006,1,1,1110001,1
|
||||
30080004,1,1,1110001,1
|
||||
30080005,1,1,1110001,1
|
||||
30080006,1,1,1110001,1
|
||||
30090004,1,1,1110001,1
|
||||
30090005,1,1,1110001,1
|
||||
30090006,1,1,1110001,1
|
||||
30100004,1,1,1110001,1
|
||||
30100005,1,1,1110001,1
|
||||
30100006,1,1,1110001,1
|
||||
30110004,1,1,1110001,1
|
||||
30110005,1,1,1110001,1
|
||||
30110006,1,1,1110001,1
|
||||
30120004,1,1,1110001,1
|
||||
30120005,1,1,1110001,1
|
||||
30120006,1,1,1110001,1
|
||||
40010004,1,1,1110001,1
|
||||
40010005,1,1,1110001,1
|
||||
40010006,1,1,1110001,1
|
||||
40020004,1,1,1110001,1
|
||||
40020005,1,1,1110001,1
|
||||
40020006,1,1,1110001,1
|
||||
40030004,1,1,1110001,1
|
||||
40030005,1,1,1110001,1
|
||||
40030006,1,1,1110001,1
|
||||
40040004,1,1,1110001,1
|
||||
40040005,1,1,1110001,1
|
||||
40040006,1,1,1110001,1
|
||||
40050004,1,1,1110001,1
|
||||
40050005,1,1,1110001,1
|
||||
40050006,1,1,1110001,1
|
||||
40060004,1,1,1110001,1
|
||||
40060005,1,1,1110001,1
|
||||
40060006,1,1,1110001,1
|
||||
40070004,1,1,1110001,1
|
||||
40070005,1,1,1110001,1
|
||||
40070006,1,1,1110001,1
|
||||
40080004,1,1,1110001,1
|
||||
40080005,1,1,1110001,1
|
||||
40080006,1,1,1110001,1
|
||||
40090004,1,1,1110001,1
|
||||
40090005,1,1,1110001,1
|
||||
40090006,1,1,1110001,1
|
||||
10010001,1,1,1110001,1
|
||||
10010002,1,1,1110001,1
|
||||
10010003,1,1,1110001,1
|
||||
10010004,1,1,1110001,1
|
||||
10010005,1,1,1110001,1
|
||||
10010006,1,1,1110001,1
|
||||
10010007,1,1,1110001,1
|
||||
10010008,1,1,1110001,1
|
||||
10010009,1,1,1110001,1
|
||||
10020001,1,1,1110001,1
|
||||
10020002,1,1,1110001,1
|
||||
10020003,1,1,1110001,1
|
||||
10020004,1,1,1110001,1
|
||||
10020005,1,1,1110001,1
|
||||
10020006,1,1,1110001,1
|
||||
10020007,1,1,1110001,1
|
||||
10020008,1,1,1110001,1
|
||||
10020009,1,1,1110001,1
|
||||
10030001,1,1,1110001,1
|
||||
10030002,1,1,1110001,1
|
||||
10030003,1,1,1110001,1
|
||||
10030004,1,1,1110001,1
|
||||
10030005,1,1,1110001,1
|
||||
10030006,1,1,1110001,1
|
||||
10030007,1,1,1110001,1
|
||||
10030008,1,1,1110001,1
|
||||
10030009,1,1,1110001,1
|
||||
10040001,1,1,1110001,1
|
||||
10040002,1,1,1110001,1
|
||||
10040003,1,1,1110001,1
|
||||
10040004,1,1,1110001,1
|
||||
10040005,1,1,1110001,1
|
||||
10040006,1,1,1110001,1
|
||||
10040007,1,1,1110001,1
|
||||
10040008,1,1,1110001,1
|
||||
10040009,1,1,1110001,1
|
||||
10050001,1,1,1110001,1
|
||||
10050002,1,1,1110001,1
|
||||
10050003,1,1,1110001,1
|
||||
10050004,1,1,1110001,1
|
||||
10050005,1,1,1110001,1
|
||||
10050006,1,1,1110001,1
|
||||
10050007,1,1,1110001,1
|
||||
10050008,1,1,1110001,1
|
||||
10050009,1,1,1110001,1
|
||||
10060001,1,1,1110001,1
|
||||
10060002,1,1,1110001,1
|
||||
10060003,1,1,1110001,1
|
||||
10060004,1,1,1110001,1
|
||||
10060005,1,1,1110001,1
|
||||
10060006,1,1,1110001,1
|
||||
10060007,1,1,1110001,1
|
||||
10060008,1,1,1110001,1
|
||||
10060009,1,1,1110001,1
|
||||
10070001,1,1,1110001,1
|
||||
10070002,1,1,1110001,1
|
||||
10070003,1,1,1110001,1
|
||||
10070004,1,1,1110001,1
|
||||
10070005,1,1,1110001,1
|
||||
10070006,1,1,1110001,1
|
||||
10070007,1,1,1110001,1
|
||||
10070008,1,1,1110001,1
|
||||
10070009,1,1,1110001,1
|
||||
10080001,1,1,1110001,1
|
||||
10080002,1,1,1110001,1
|
||||
10080003,1,1,1110001,1
|
||||
10080004,1,1,1110001,1
|
||||
10080005,1,1,1110001,1
|
||||
10080006,1,1,1110001,1
|
||||
10080007,1,1,1110001,1
|
||||
10080008,1,1,1110001,1
|
||||
10080009,1,1,1110001,1
|
||||
10090001,1,1,1110001,1
|
||||
10090002,1,1,1110001,1
|
||||
10090003,1,1,1110001,1
|
||||
10090004,1,1,1110001,1
|
||||
10090005,1,1,1110001,1
|
||||
10090006,1,1,1110001,1
|
||||
10090007,1,1,1110001,1
|
||||
10090008,1,1,1110001,1
|
||||
10090009,1,1,1110001,1
|
||||
20010001,1,1,1110001,1
|
||||
20010002,1,1,1110001,1
|
||||
20010003,1,1,1110001,1
|
||||
20010004,1,1,1110001,1
|
||||
20010005,1,1,1110001,1
|
||||
20010006,1,1,1110001,1
|
||||
20010007,1,1,1110001,1
|
||||
20020001,1,1,1110001,1
|
||||
20020002,1,1,1110001,1
|
||||
20020003,1,1,1110001,1
|
||||
20020004,1,1,1110001,1
|
||||
20020005,1,1,1110001,1
|
||||
20020006,1,1,1110001,1
|
||||
20020007,1,1,1110001,1
|
||||
20030001,1,1,1110001,1
|
||||
20030002,1,1,1110001,1
|
||||
20030003,1,1,1110001,1
|
||||
20030004,1,1,1110001,1
|
||||
20030005,1,1,1110001,1
|
||||
20030006,1,1,1110001,1
|
||||
20030007,1,1,1110001,1
|
||||
20040001,1,1,1110001,1
|
||||
20040002,1,1,1110001,1
|
||||
20040003,1,1,1110001,1
|
||||
20040004,1,1,1110001,1
|
||||
20040005,1,1,1110001,1
|
||||
20040006,1,1,1110001,1
|
||||
20040007,1,1,1110001,1
|
||||
20050001,1,1,1110001,1
|
||||
20050002,1,1,1110001,1
|
||||
20050003,1,1,1110001,1
|
||||
20050004,1,1,1110001,1
|
||||
20050005,1,1,1110001,1
|
||||
20050006,1,1,1110001,1
|
||||
20050007,1,1,1110001,1
|
||||
20060001,1,1,1110001,1
|
||||
20060002,1,1,1110001,1
|
||||
20060003,1,1,1110001,1
|
||||
20060004,1,1,1110001,1
|
||||
20060005,1,1,1110001,1
|
||||
20060006,1,1,1110001,1
|
||||
20060007,1,1,1110001,1
|
||||
20070001,1,1,1110001,1
|
||||
20070002,1,1,1110001,1
|
||||
20070003,1,1,1110001,1
|
||||
20070004,1,1,1110001,1
|
||||
20070005,1,1,1110001,1
|
||||
20070006,1,1,1110001,1
|
||||
20070007,1,1,1110001,1
|
||||
20080001,1,1,1110001,1
|
||||
20080002,1,1,1110001,1
|
||||
20080003,1,1,1110001,1
|
||||
20080004,1,1,1110001,1
|
||||
20080005,1,1,1110001,1
|
||||
20080006,1,1,1110001,1
|
||||
20080007,1,1,1110001,1
|
||||
20090001,1,1,1110001,1
|
||||
20090002,1,1,1110001,1
|
||||
20090003,1,1,1110001,1
|
||||
20090004,1,1,1110001,1
|
||||
20090005,1,1,1110001,1
|
||||
20090006,1,1,1110001,1
|
||||
20090007,1,1,1110001,1
|
||||
30010001,1,1,1110001,1
|
||||
30010002,1,1,1110001,1
|
||||
30010003,1,1,1110001,1
|
||||
30020001,1,1,1110001,1
|
||||
30020002,1,1,1110001,1
|
||||
30020003,1,1,1110001,1
|
||||
30030001,1,1,1110001,1
|
||||
30030002,1,1,1110001,1
|
||||
30030003,1,1,1110001,1
|
||||
30040001,1,1,1110001,1
|
||||
30040002,1,1,1110001,1
|
||||
30040003,1,1,1110001,1
|
||||
30050001,1,1,1110001,1
|
||||
30050002,1,1,1110001,1
|
||||
30050003,1,1,1110001,1
|
||||
30060001,1,1,1110001,1
|
||||
30060002,1,1,1110001,1
|
||||
30060003,1,1,1110001,1
|
||||
30070001,1,1,1110001,1
|
||||
30070002,1,1,1110001,1
|
||||
30070003,1,1,1110001,1
|
||||
30080001,1,1,1110001,1
|
||||
30080002,1,1,1110001,1
|
||||
30080003,1,1,1110001,1
|
||||
30090001,1,1,1110001,1
|
||||
30090002,1,1,1110001,1
|
||||
30090003,1,1,1110001,1
|
||||
30100001,1,1,1110001,1
|
||||
30100002,1,1,1110001,1
|
||||
30100003,1,1,1110001,1
|
||||
30110001,1,1,1110001,1
|
||||
30110002,1,1,1110001,1
|
||||
30110003,1,1,1110001,1
|
||||
30120001,1,1,1110001,1
|
||||
30120002,1,1,1110001,1
|
||||
30120003,1,1,1110001,1
|
||||
40010001,1,1,1110001,1
|
||||
40010002,1,1,1110001,1
|
||||
40010003,1,1,1110001,1
|
||||
40020001,1,1,1110001,1
|
||||
40020002,1,1,1110001,1
|
||||
40020003,1,1,1110001,1
|
||||
40030001,1,1,1110001,1
|
||||
40030002,1,1,1110001,1
|
||||
40030003,1,1,1110001,1
|
||||
40040001,1,1,1110001,1
|
||||
40040002,1,1,1110001,1
|
||||
40040003,1,1,1110001,1
|
||||
40050001,1,1,1110001,1
|
||||
40050002,1,1,1110001,1
|
||||
40050003,1,1,1110001,1
|
||||
40060001,1,1,1110001,1
|
||||
40060002,1,1,1110001,1
|
||||
40060003,1,1,1110001,1
|
||||
40070001,1,1,1110001,1
|
||||
40070002,1,1,1110001,1
|
||||
40070003,1,1,1110001,1
|
||||
40080001,1,1,1110001,1
|
||||
40080002,1,1,1110001,1
|
||||
40080003,1,1,1110001,1
|
||||
40090001,1,1,1110001,1
|
||||
40090002,1,1,1110001,1
|
||||
40090003,1,1,1110001,1
|
||||
|
241
src/router/databases/csv-en/card_level.csv
Normal file
241
src/router/databases/csv-en/card_level.csv
Normal file
@@ -0,0 +1,241 @@
|
||||
_id,_level,_exp,_hpRatio,_smileRatio,_pureRatio,_coolRatio,_masterReleaseLabelId
|
||||
1,1,0,10000,7830,7830,7830,1
|
||||
1,2,100,10000,7860,7860,7860,1
|
||||
1,3,300,10000,7890,7890,7890,1
|
||||
1,4,600,10000,7920,7920,7920,1
|
||||
1,5,1025,10000,7950,7950,7950,1
|
||||
1,6,1454,10000,7980,7980,7980,1
|
||||
1,7,1889,10000,8010,8010,8010,1
|
||||
1,8,2332,10000,8040,8040,8040,1
|
||||
1,9,2787,10000,8070,8070,8070,1
|
||||
1,10,3254,10000,8100,8100,8100,1
|
||||
1,11,3739,10000,8130,8130,8130,1
|
||||
1,12,4244,10000,8160,8160,8160,1
|
||||
1,13,4773,10000,8190,8190,8190,1
|
||||
1,14,5330,10000,8220,8220,8220,1
|
||||
1,15,5920,10000,8250,8250,8250,1
|
||||
1,16,6549,10000,8280,8280,8280,1
|
||||
1,17,7220,10000,8310,8310,8310,1
|
||||
1,18,7939,10000,8340,8340,8340,1
|
||||
1,19,8714,10000,8370,8370,8370,1
|
||||
1,20,9548,10000,8400,8400,8400,1
|
||||
1,21,10450,10000,8430,8430,8430,1
|
||||
1,22,11426,10000,8460,8460,8460,1
|
||||
1,23,12484,10000,8490,8490,8490,1
|
||||
1,24,13630,10000,8520,8520,8520,1
|
||||
1,25,14873,10000,8550,8550,8550,1
|
||||
1,26,16221,10000,8580,8580,8580,1
|
||||
1,27,17683,10000,8610,8610,8610,1
|
||||
1,28,19267,10000,8640,8640,8640,1
|
||||
1,29,20983,10000,8670,8670,8670,1
|
||||
1,30,22840,10000,8700,8700,8700,1
|
||||
1,31,24848,10000,8730,8730,8730,1
|
||||
1,32,27018,10000,8760,8760,8760,1
|
||||
1,33,29359,10000,8790,8790,8790,1
|
||||
1,34,31884,10000,8820,8820,8820,1
|
||||
1,35,34603,10000,8850,8850,8850,1
|
||||
1,36,37528,10000,8880,8880,8880,1
|
||||
1,37,40670,10000,8910,8910,8910,1
|
||||
1,38,44043,10000,8940,8940,8940,1
|
||||
1,39,47658,10000,8970,8970,8970,1
|
||||
1,40,51528,10000,9000,9000,9000,1
|
||||
1,41,55668,10000,9050,9050,9050,1
|
||||
1,42,60089,10000,9100,9100,9100,1
|
||||
1,43,64807,10000,9150,9150,9150,1
|
||||
1,44,69836,10000,9200,9200,9200,1
|
||||
1,45,75190,10000,9250,9250,9250,1
|
||||
1,46,80884,10000,9300,9300,9300,1
|
||||
1,47,86934,10000,9350,9350,9350,1
|
||||
1,48,93355,10000,9400,9400,9400,1
|
||||
1,49,100163,10000,9450,9450,9450,1
|
||||
1,50,107374,10000,9500,9500,9500,1
|
||||
1,51,115005,10000,9550,9550,9550,1
|
||||
1,52,123073,10000,9600,9600,9600,1
|
||||
1,53,131596,10000,9650,9650,9650,1
|
||||
1,54,140590,10000,9700,9700,9700,1
|
||||
1,55,150074,10000,9750,9750,9750,1
|
||||
1,56,160067,10000,9800,9800,9800,1
|
||||
1,57,170586,10000,9850,9850,9850,1
|
||||
1,58,181651,10000,9900,9900,9900,1
|
||||
1,59,193282,10000,9950,9950,9950,1
|
||||
1,60,205497,10000,10000,10000,10000,1
|
||||
2,1,0,10000,7230,7230,7230,1
|
||||
2,2,100,10000,7260,7260,7260,1
|
||||
2,3,300,10000,7290,7290,7290,1
|
||||
2,4,600,10000,7320,7320,7320,1
|
||||
2,5,1025,10000,7350,7350,7350,1
|
||||
2,6,1454,10000,7380,7380,7380,1
|
||||
2,7,1889,10000,7410,7410,7410,1
|
||||
2,8,2332,10000,7440,7440,7440,1
|
||||
2,9,2787,10000,7470,7470,7470,1
|
||||
2,10,3254,10000,7500,7500,7500,1
|
||||
2,11,3739,10000,7530,7530,7530,1
|
||||
2,12,4244,10000,7560,7560,7560,1
|
||||
2,13,4773,10000,7590,7590,7590,1
|
||||
2,14,5330,10000,7620,7620,7620,1
|
||||
2,15,5920,10000,7650,7650,7650,1
|
||||
2,16,6549,10000,7680,7680,7680,1
|
||||
2,17,7220,10000,7710,7710,7710,1
|
||||
2,18,7939,10000,7740,7740,7740,1
|
||||
2,19,8714,10000,7770,7770,7770,1
|
||||
2,20,9548,10000,7800,7800,7800,1
|
||||
2,21,10450,10000,7830,7830,7830,1
|
||||
2,22,11426,10000,7860,7860,7860,1
|
||||
2,23,12484,10000,7890,7890,7890,1
|
||||
2,24,13630,10000,7920,7920,7920,1
|
||||
2,25,14873,10000,7950,7950,7950,1
|
||||
2,26,16221,10000,7980,7980,7980,1
|
||||
2,27,17683,10000,8010,8010,8010,1
|
||||
2,28,19267,10000,8040,8040,8040,1
|
||||
2,29,20983,10000,8070,8070,8070,1
|
||||
2,30,22840,10000,8100,8100,8100,1
|
||||
2,31,24848,10000,8130,8130,8130,1
|
||||
2,32,27018,10000,8160,8160,8160,1
|
||||
2,33,29359,10000,8190,8190,8190,1
|
||||
2,34,31884,10000,8220,8220,8220,1
|
||||
2,35,34603,10000,8250,8250,8250,1
|
||||
2,36,37528,10000,8280,8280,8280,1
|
||||
2,37,40670,10000,8310,8310,8310,1
|
||||
2,38,44043,10000,8340,8340,8340,1
|
||||
2,39,47658,10000,8370,8370,8370,1
|
||||
2,40,51528,10000,8400,8400,8400,1
|
||||
2,41,55668,10000,8430,8430,8430,1
|
||||
2,42,60089,10000,8460,8460,8460,1
|
||||
2,43,64807,10000,8490,8490,8490,1
|
||||
2,44,69836,10000,8520,8520,8520,1
|
||||
2,45,75190,10000,8550,8550,8550,1
|
||||
2,46,80884,10000,8580,8580,8580,1
|
||||
2,47,86934,10000,8610,8610,8610,1
|
||||
2,48,93355,10000,8640,8640,8640,1
|
||||
2,49,100163,10000,8670,8670,8670,1
|
||||
2,50,107374,10000,8700,8700,8700,1
|
||||
2,51,115005,10000,8730,8730,8730,1
|
||||
2,52,123073,10000,8760,8760,8760,1
|
||||
2,53,131596,10000,8790,8790,8790,1
|
||||
2,54,140590,10000,8820,8820,8820,1
|
||||
2,55,150074,10000,8850,8850,8850,1
|
||||
2,56,160067,10000,8880,8880,8880,1
|
||||
2,57,170586,10000,8910,8910,8910,1
|
||||
2,58,181651,10000,8940,8940,8940,1
|
||||
2,59,193282,10000,8970,8970,8970,1
|
||||
2,60,205497,10000,9000,9000,9000,1
|
||||
2,61,218317,10000,9050,9050,9050,1
|
||||
2,62,231762,10000,9100,9100,9100,1
|
||||
2,63,245853,10000,9150,9150,9150,1
|
||||
2,64,260610,10000,9200,9200,9200,1
|
||||
2,65,276056,10000,9250,9250,9250,1
|
||||
2,66,292212,10000,9300,9300,9300,1
|
||||
2,67,309099,10000,9350,9350,9350,1
|
||||
2,68,326740,10000,9400,9400,9400,1
|
||||
2,69,345159,10000,9450,9450,9450,1
|
||||
2,70,364377,10000,9500,9500,9500,1
|
||||
2,71,384418,10000,9550,9550,9550,1
|
||||
2,72,405307,10000,9600,9600,9600,1
|
||||
2,73,427066,10000,9650,9650,9650,1
|
||||
2,74,449720,10000,9700,9700,9700,1
|
||||
2,75,473295,10000,9750,9750,9750,1
|
||||
2,76,497814,10000,9800,9800,9800,1
|
||||
2,77,523304,10000,9850,9850,9850,1
|
||||
2,78,549790,10000,9900,9900,9900,1
|
||||
2,79,577298,10000,9950,9950,9950,1
|
||||
2,80,605854,10000,10000,10000,10000,1
|
||||
3,1,0,10000,6630,6630,6630,1
|
||||
3,2,100,10000,6660,6660,6660,1
|
||||
3,3,300,10000,6690,6690,6690,1
|
||||
3,4,600,10000,6720,6720,6720,1
|
||||
3,5,1025,10000,6750,6750,6750,1
|
||||
3,6,1454,10000,6780,6780,6780,1
|
||||
3,7,1889,10000,6810,6810,6810,1
|
||||
3,8,2332,10000,6840,6840,6840,1
|
||||
3,9,2787,10000,6870,6870,6870,1
|
||||
3,10,3254,10000,6900,6900,6900,1
|
||||
3,11,3739,10000,6930,6930,6930,1
|
||||
3,12,4244,10000,6960,6960,6960,1
|
||||
3,13,4773,10000,6990,6990,6990,1
|
||||
3,14,5330,10000,7020,7020,7020,1
|
||||
3,15,5920,10000,7050,7050,7050,1
|
||||
3,16,6549,10000,7080,7080,7080,1
|
||||
3,17,7220,10000,7110,7110,7110,1
|
||||
3,18,7939,10000,7140,7140,7140,1
|
||||
3,19,8714,10000,7170,7170,7170,1
|
||||
3,20,9548,10000,7200,7200,7200,1
|
||||
3,21,10450,10000,7230,7230,7230,1
|
||||
3,22,11426,10000,7260,7260,7260,1
|
||||
3,23,12484,10000,7290,7290,7290,1
|
||||
3,24,13630,10000,7320,7320,7320,1
|
||||
3,25,14873,10000,7350,7350,7350,1
|
||||
3,26,16221,10000,7380,7380,7380,1
|
||||
3,27,17683,10000,7410,7410,7410,1
|
||||
3,28,19267,10000,7440,7440,7440,1
|
||||
3,29,20983,10000,7470,7470,7470,1
|
||||
3,30,22840,10000,7500,7500,7500,1
|
||||
3,31,24848,10000,7530,7530,7530,1
|
||||
3,32,27018,10000,7560,7560,7560,1
|
||||
3,33,29359,10000,7590,7590,7590,1
|
||||
3,34,31884,10000,7620,7620,7620,1
|
||||
3,35,34603,10000,7650,7650,7650,1
|
||||
3,36,37528,10000,7680,7680,7680,1
|
||||
3,37,40670,10000,7710,7710,7710,1
|
||||
3,38,44043,10000,7740,7740,7740,1
|
||||
3,39,47658,10000,7770,7770,7770,1
|
||||
3,40,51528,10000,7800,7800,7800,1
|
||||
3,41,55668,10000,7830,7830,7830,1
|
||||
3,42,60089,10000,7860,7860,7860,1
|
||||
3,43,64807,10000,7890,7890,7890,1
|
||||
3,44,69836,10000,7920,7920,7920,1
|
||||
3,45,75190,10000,7950,7950,7950,1
|
||||
3,46,80884,10000,7980,7980,7980,1
|
||||
3,47,86934,10000,8010,8010,8010,1
|
||||
3,48,93355,10000,8040,8040,8040,1
|
||||
3,49,100163,10000,8070,8070,8070,1
|
||||
3,50,107374,10000,8100,8100,8100,1
|
||||
3,51,115005,10000,8130,8130,8130,1
|
||||
3,52,123073,10000,8160,8160,8160,1
|
||||
3,53,131596,10000,8190,8190,8190,1
|
||||
3,54,140590,10000,8220,8220,8220,1
|
||||
3,55,150074,10000,8250,8250,8250,1
|
||||
3,56,160067,10000,8280,8280,8280,1
|
||||
3,57,170586,10000,8310,8310,8310,1
|
||||
3,58,181651,10000,8340,8340,8340,1
|
||||
3,59,193282,10000,8370,8370,8370,1
|
||||
3,60,205497,10000,8400,8400,8400,1
|
||||
3,61,218317,10000,8430,8430,8430,1
|
||||
3,62,231762,10000,8460,8460,8460,1
|
||||
3,63,245853,10000,8490,8490,8490,1
|
||||
3,64,260610,10000,8520,8520,8520,1
|
||||
3,65,276056,10000,8550,8550,8550,1
|
||||
3,66,292212,10000,8580,8580,8580,1
|
||||
3,67,309099,10000,8610,8610,8610,1
|
||||
3,68,326740,10000,8640,8640,8640,1
|
||||
3,69,345159,10000,8670,8670,8670,1
|
||||
3,70,364377,10000,8700,8700,8700,1
|
||||
3,71,384418,10000,8730,8730,8730,1
|
||||
3,72,405307,10000,8760,8760,8760,1
|
||||
3,73,427066,10000,8790,8790,8790,1
|
||||
3,74,449720,10000,8820,8820,8820,1
|
||||
3,75,473295,10000,8850,8850,8850,1
|
||||
3,76,497814,10000,8880,8880,8880,1
|
||||
3,77,523304,10000,8910,8910,8910,1
|
||||
3,78,549790,10000,8940,8940,8940,1
|
||||
3,79,577298,10000,8970,8970,8970,1
|
||||
3,80,605854,10000,9000,9000,9000,1
|
||||
3,81,635486,10000,9050,9050,9050,1
|
||||
3,82,666220,10000,9100,9100,9100,1
|
||||
3,83,698083,10000,9150,9150,9150,1
|
||||
3,84,731104,10000,9200,9200,9200,1
|
||||
3,85,765311,10000,9250,9250,9250,1
|
||||
3,86,800731,10000,9300,9300,9300,1
|
||||
3,87,837393,10000,9350,9350,9350,1
|
||||
3,88,875328,10000,9400,9400,9400,1
|
||||
3,89,914563,10000,9450,9450,9450,1
|
||||
3,90,955129,10000,9500,9500,9500,1
|
||||
3,91,997056,10000,9550,9550,9550,1
|
||||
3,92,1040374,10000,9600,9600,9600,1
|
||||
3,93,1085113,10000,9650,9650,9650,1
|
||||
3,94,1131306,10000,9700,9700,9700,1
|
||||
3,95,1178984,10000,9750,9750,9750,1
|
||||
3,96,1228177,10000,9800,9800,9800,1
|
||||
3,97,1278919,10000,9850,9850,9850,1
|
||||
3,98,1331242,10000,9900,9900,9900,1
|
||||
3,99,1385178,10000,9950,9950,9950,1
|
||||
3,100,1440761,10000,10000,10000,10000,1
|
||||
|
4
src/router/databases/csv-en/card_rarity.csv
Normal file
4
src/router/databases/csv-en/card_rarity.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
_rarity,_maxLevel,_baseEvolveCount,_masterCardSkillLevelId,_exchangeMasterItemId,_exchangeItemAmount,_masterReleaseLabelId
|
||||
1,40,1,1,19100001,20,1
|
||||
2,60,1,2,19100001,50,1
|
||||
3,80,1,3,19100001,500,1
|
||||
|
18
src/router/databases/csv-en/card_skill_level.csv
Normal file
18
src/router/databases/csv-en/card_skill_level.csv
Normal file
@@ -0,0 +1,18 @@
|
||||
_id,_level,_exp,_masterReleaseLabelId
|
||||
1,1,0,1
|
||||
1,2,1000,1
|
||||
1,3,3200,1
|
||||
2,1,0,1
|
||||
2,2,1000,1
|
||||
2,3,3200,1
|
||||
2,4,8100,1
|
||||
2,5,17800,1
|
||||
3,1,0,1
|
||||
3,2,1000,1
|
||||
3,3,3200,1
|
||||
3,4,8100,1
|
||||
3,5,17800,1
|
||||
3,6,35000,1
|
||||
3,7,63000,1
|
||||
3,8,105700,1
|
||||
3,9,167600,1
|
||||
|
347
src/router/databases/csv-en/card_sys_voice.csv
Normal file
347
src/router/databases/csv-en/card_sys_voice.csv
Normal file
@@ -0,0 +1,347 @@
|
||||
_id,_num,_masterVoiceId,_systemVoiceType,_value,_textJa,_textEn,_masterReleaseLabelId
|
||||
10010013,1,51010131,52,0,"Both of you, look at this!<br>The cherry blossom is sooo pretty!",test,1
|
||||
10010013,2,51010132,53,0,"Ready, set!<br>Go for it!",test,1
|
||||
10020013,1,51020131,52,0,Oh? It's already this late…<br>Nozomi is gonna scold me,test,1
|
||||
10020013,2,51020132,53,0,Let me hear an even louder cheer!,test,1
|
||||
10030013,1,51030131,52,0,"Please come and play, master♪",test,1
|
||||
10030013,2,51030132,53,0,I'm gonna make my snack-!,test,1
|
||||
10040013,1,51040131,52,0,Controlling the Spirit…<br>Concentrate on the bow…,test,1
|
||||
10040013,2,51040132,53,0,I'll aim for everyone's heart-!<br>Love Arrow Shoot!,test,1
|
||||
10050013,1,51050131,52,0,"The rain fiiinally cleared up, meow!<br>Let's hurry and practice, meow♪",test,1
|
||||
10050013,2,51050132,53,0,All together now~!<br>Meow-meow-meow~!,test,1
|
||||
10060013,1,51060131,52,0,"Hey, hey!<br>Don't take pictures so suddenly!",test,1
|
||||
10060013,2,51060132,53,0,"Everyone!<br>You're having a good time,<br>aren't you?",test,1
|
||||
10070013,1,51070131,52,0,The sun is in a good mood today~,test,1
|
||||
10070013,2,51070132,53,0,Over there!<br>I'll share my<br>spiritual power with you♪,test,1
|
||||
10080013,1,51080131,52,0,I'm really glad I mustered up<br>the courage back then…,test,1
|
||||
10080013,2,51080132,53,0,Everyone~!<br>Are you enjoying<br>our live show?,test,1
|
||||
10090013,1,51090131,52,0,Idols should always<br>be aware that they're being<br>watched! Got it?!,test,1
|
||||
10090013,2,51090132,53,0,"All together now, everyone~,<br>Nico-Nico-Ni~!",test,1
|
||||
20010011,1,52010111,52,0,"Hee, hee, hee.<br>The sea of Uchiura is<br>really pretty, isn't it♪",test,1
|
||||
20010011,2,52010112,53,0,"Every-one, Hello-Chika-! Let's all get<br>fired up today♪",test,1
|
||||
20020011,1,52020111,52,0,Chika and You… Singing<br>with the two of them is so fun and<br>I love it!,test,1
|
||||
20020011,2,52020112,53,0,I'll hit everyone with Aqours'<br>passionate feelings!<br>Riko Beam!,test,1
|
||||
20030011,1,52030111,52,0,To be able to see this scenery<br>everyday... What a luxury!,test,1
|
||||
20030011,2,52030112,53,0,"Everyone, are you having a great<br>time! Let's hug♪",test,1
|
||||
20040011,1,52040111,52,0,"Ruby, it's morning-! Good Grief,<br>I can't wake you up when I see<br>your pleasant face…",test,1
|
||||
20040011,2,52040112,53,0,"Everyone! If you don't keep up with<br>us closely, that's a buu, buu!",test,1
|
||||
20050011,1,52050111,52,0,Score-!<br>I've best my personal record!,test,1
|
||||
20050011,2,52050112,53,0,Full speed ahead~ Yosoro!<br>Followed by~ Bow!,test,1
|
||||
20060011,1,52060111,52,0,I will gather the power of darkness<br>into this hand... Behold the power of<br>the fallen angel!,test,1
|
||||
20060011,2,52060112,53,0,"Mwahaha…<br>Fallen angel Yohane, descending ☆ !!",test,1
|
||||
20070011,1,52070111,52,0,"*Yawwwwn....* The Sun's so nice and<br>warm, it's making me sleepy, zura......",test,1
|
||||
20070011,2,52070112,53,0,"Everyone - ! Let's go, zura-!<br>Ohana~? Maru-!!",test,1
|
||||
20080011,1,52080111,52,0,"There are so many superb views in<br>this world, but the landscape at<br>Awashima is special♪",test,1
|
||||
20080011,2,52080112,53,0,"Eveeeryone, Shiny- ♪<br>and... Lock-on!",test,1
|
||||
20090011,1,52090111,52,0,"Urn.... *Yaaawwwwn*... mmhm...<br>Morning, Dia.",test,1
|
||||
20090011,2,52090112,53,0,Everyone with me~... Ganbaruby♡,test,1
|
||||
30010007,1,53010071,52,0,Morning! Let's do our best today too!,test,1
|
||||
30010007,2,53010072,53,0,"I'll deliver a big voice that the whole<br>universe can hear, please listen to it!",test,1
|
||||
30020007,1,53020071,52,0,"Yu Senpai♪ Here, Say, Aa~h♡",test,1
|
||||
30020007,2,53020072,53,0,"It's Kasumin, everyone's princess♪",test,1
|
||||
30030007,1,53030071,52,0,Do not be afraid!<br>I am... By your side!,test,1
|
||||
30030007,2,53030072,53,0,Please look at the real me!,test,1
|
||||
30040007,1,53040071,52,0,Shall I twist my hips a little bit more<br>in this pose?,test,1
|
||||
30040007,2,53040072,53,0,Today's target is gonna be y-o-u!,test,1
|
||||
30050007,1,53050071,52,0,I'mma break through this fence by<br>going on the OFFENSIVE! ――<br>Just kidding!!,test,1
|
||||
30050007,2,53050072,53,0,Let's all get high with friends through<br>HIGH fives♪<br>Just Kidding♪,test,1
|
||||
30060007,1,53060071,52,0,"Haruka-chan,<br>have as much as you want~♪",test,1
|
||||
30060007,2,53060072,53,0,"I had a great dream today, too~",test,1
|
||||
30070007,1,53070071,52,0,The battle scenes of the Princess of<br>the Crimson Sword never fail to put<br>me in breathless suspense!,test,1
|
||||
30070007,2,53070072,53,0,Setsuna☆Scarlet Storm!!,test,1
|
||||
30080007,1,53080071,52,0,Eek!? What energetic fishes♪<br>Hello~!,test,1
|
||||
30080007,2,53080072,53,0,"Negative Ion, Release~!",test,1
|
||||
30090007,1,53090071,52,0,… Shall we play together?,test,1
|
||||
30090007,2,53090072,53,0,Rina-chan board: Ehehehe,test,1
|
||||
30100007,1,53100071,52,0,I have to work hard to not lose to<br>anyone!,test,1
|
||||
30100007,2,53100072,53,0,I will deliver a fun live show befitting<br>of your enjoyment with everything<br>I have!,test,1
|
||||
30110007,1,53110071,52,0,Wanna hear the song I've just<br>finished composing? It's very cool!,test,1
|
||||
30110007,2,53110072,53,0,"Excellent! Great performance,<br>little baby!",test,1
|
||||
30120007,1,53120071,52,0,Everyone's amazing! But Lanzhu's<br>performance is of course the best♪,test,1
|
||||
30120007,2,53120072,53,0,"Let me introduce you to Lanzhu's<br>friend! Yes, it's you!",test,1
|
||||
40010007,1,54010071,52,0,Let's all sing together!<br>Ready~? Let's go!,test,1
|
||||
40010007,2,54010072,53,0,Please enjoy Liella!'s<br>performance as much as<br>you can today~!,test,1
|
||||
40020007,1,54020071,52,0,"Heheh,<br>I'll show you how masterful<br>my handiwork is!",test,1
|
||||
40020007,2,54020072,53,0,Are you enjoying<br>Liella!'s live show~!?,test,1
|
||||
40030007,1,54030071,52,0,"1, 2, 3, 4... Jump!!",test,1
|
||||
40030007,2,54030072,53,0,Hey~!<br>Make sure to enjoy<br>Liella!'s live show today!,test,1
|
||||
40040007,1,54040071,52,0,You're still looking around!?<br>...Take a look at all these bags and<br>say that again!,test,1
|
||||
40040007,2,54040072,53,0,"I'm gonna do it, so let's do it, okay?<br>Galaxy~~~~!!",test,1
|
||||
40050007,1,54050071,52,0,"Mother, Yuigaoka's cherry blossoms <br>are blooming in their full, <br>splendid glory.",test,1
|
||||
40050007,2,54050072,53,0,"Everyone, <br>Liella! will send you so many <br>wonderful songs today!",test,1
|
||||
40060007,1,54060071,52,0,It's so much fun to be<br>with Kanon-senpai~!<br>I'm so moved~!,test,1
|
||||
40060007,2,54060072,53,0,Being able to sing on such<br>a big stage<br>is like a dream!,test,1
|
||||
40070007,1,54070071,52,0,"Yes, yes, yes, yes!<br>There we go, there we go!!<br>I got Kanon-senpai~~~!!",test,1
|
||||
40070007,2,54070072,53,0,"Cheer for us, everyone~!",test,1
|
||||
40080007,1,54080071,52,0,"Those school idols are cute,<br>but Mei is cuter.",test,1
|
||||
40080007,2,54080072,53,0,"Forget about me, look at Mei.<br>She's so cute.",test,1
|
||||
40090007,1,54090071,52,0,"Today Liella! is training stylishly in<br>Harajuku♪<br>I'll snap shots of our senpais on<br>break, yes~!",test,1
|
||||
40090007,2,54090072,53,0,"I'll give it my all again today, yes!<br>ONINUTS~!!",test,1
|
||||
10010015,2,51010152,53,0,Everyone -! Let's get heated up at this<br>live show together with µ's!,test,1
|
||||
20010013,2,52010132,53,0,I can feel everyone's burning<br>excitement! I'll make Aqours even<br>mooore special in today's live show!,test,1
|
||||
30010009,2,53010092,53,0,"Everyone-! Are you enjoying<br>Nijigasaki's live show that's packed<br>with ""love""-?",test,1
|
||||
40010009,2,54010092,53,0,Are our songs echoing in all your<br>hearts~?<br>They're full of Liella!'s love for<br>you...♪,test,1
|
||||
40090009,1,54090091,52,0,"Ren Senpai! Let's match our<br>smartphone wallpapers, yes!",,223041902
|
||||
40090009,2,54090092,53,0,"Can I have an ice cream? Please let<br>me have these toppings, too! Yes!",,223041902
|
||||
40020009,1,54020091,52,0,"Kanon, Please come closer over here!<br>I'm taking the shot!~",,223041902
|
||||
40020009,2,54020092,53,0,Let's spend a sweet time with Keke ♪,,223041902
|
||||
40030009,1,54030091,52,0,"Keke chan, have some ice cream,<br>let's get fired up!",,223041904
|
||||
40030009,2,54030092,53,0,I will let you eat this sweeeeeet<br>ice cream!,,223041904
|
||||
10010016,1,51010161,52,0,"Eek! That's cold!<br>Oh, thanks Umi.",,223043003
|
||||
10010016,2,51010162,53,0,I want you to see us<br>taking on these new challenges!,,223043003
|
||||
10020015,1,51020151,52,0,"Homura's new cat-shaped cookie...<br>Mmmh! ♪ It's not just cute, it's delicious!",,223043003
|
||||
10020015,2,51020152,53,0,Let's dash into tomorrow together!,,223043003
|
||||
10090015,1,51090151,52,0,I'm so glad I joined µ's!,,223043005
|
||||
10090015,2,51090152,53,0,I don't care if I stumble.<br>Get up with me!,,223043005
|
||||
20010014,1,52010141,52,0,"You, those glasses really suit you!<br>Hmm... How about mine?",,223051503
|
||||
20010014,2,52010142,53,0,Final boarding from Numazu to happiness! ♪<br>Let me take you on a wonderful journey!,,223051503
|
||||
20020013,1,52020131,52,0,"Do you want a bite Yoshiko?<br>Say ""ahhh!""",,223051503
|
||||
20020013,2,52020132,53,0,Let me guide you on a fun journey!<br>Follow me so you don't get lost. ♪,,223051503
|
||||
20070013,1,52070131,52,0,"*Munch* *munch*<br>Everything is so good, I can't help myself, Zura!",,223051505
|
||||
20070013,2,52070132,53,0,"Over here, over here! ♪<br>Time for a fun trip with me, Zura!",,223051505
|
||||
40010010,1,54010101,52,0,I'm so happy to see<br>so many things I like!,,223050104
|
||||
40010010,2,54010102,53,0,"Let me sing a<br>special song, just for you!",,223050104
|
||||
30050009,1,53050091,52,0,A BBQ with everyone<br>is the best! ♡<br>Bring on the meat!,,223053002
|
||||
30050009,2,53050092,53,0,I'm sending the hottest beats<br>right to your heart!,,223053002
|
||||
30060009,1,53060091,52,0,Today's show was so...<br>Fun... Zzz...,,223053103
|
||||
30060009,2,53060092,53,0,"Kanata, I've been waiting<br>for you to come get me for a<br>long, long time!",,223053103
|
||||
30080009,1,53080091,52,0,I hope my songs can be<br>some comfort to everyone<br>that listens.,,223053103
|
||||
30080009,2,53080092,53,0,I will always be by your side.<br>You're my favorite! ♪,,223053103
|
||||
30090009,1,53090091,52,0,What am I trying to convey<br>with my live show?,,223053105
|
||||
30090009,2,53090092,53,0,"If you're by my side,<br>the dark forest or scary wolves<br>can't faze me.",,223053105
|
||||
20030013,1,52030131,52,0,"Whoa, it's a sea turtle. ♪<br>How lucky!",,223061503
|
||||
20030013,2,52030132,53,0,"Let me give you a<br>perfect, special time. ♪",,223061503
|
||||
20040013,1,52040131,52,0,"Mari! If you move too much,<br>you're going to lose your balance!",,223061503
|
||||
20040013,2,52040132,53,0,Let me bring you<br>to my special little world. ♡,,223061503
|
||||
20090013,1,52090131,52,0,"Wow, I got so dizzy<br>I couldn't hit the watermelon!",,223061505
|
||||
20090013,2,52090132,53,0,"Today's costume is all about<br>my soft, fluttering veil!<br>Want to touch it?",,223061505
|
||||
10070015,1,51070151,52,0,"Rain isn't so bad, is it?<br>Eli, you make me feel happy. ♪",,223060902
|
||||
10070015,2,51070152,53,0,I just feel like...<br>The light is shining on our future.,,223060902
|
||||
20080013,1,52080131,52,0,"Here we go!<br>Three, two, one... Shiny! ☆",,223061302
|
||||
20080013,2,52080132,53,0,I'm so happy! ♪<br>Make sure you watch me<br>spread my wings and fly!,,223061302
|
||||
40080009,1,54080091,52,0,Mei's so serious...<br>And cute.,,223061702
|
||||
40080009,2,54080092,53,0,I want you to listen...,,223061702
|
||||
30040009,1,53040091,52,0,Aaah! W-What?!<br>Why is everyone here?,,223062902
|
||||
30040009,2,53040092,53,0,Your cheers add a new<br>color to my world!,,223062902
|
||||
40040009,1,54040091,52,0,"Blue sky, white clouds, and me...<br>A spectacular GALAXY!",,223063003
|
||||
40040009,2,54040092,53,0,"Hehe, are you sure you want<br>to be that close? Here we go!<br>You're going to get all soapy! ♪",,223063003
|
||||
40050009,1,54050091,52,0,"Nice, Mei!<br>Leave the rest to me!",,223063003
|
||||
40050009,2,54050092,53,0,Are you ready to enjoy<br>the summer with me?,,223063003
|
||||
40060010,1,54060101,52,0,"I wish I could pose like<br>you, Sumire! Let's see...<br>W-Wawawawa!",,223063005
|
||||
40060010,2,54060102,53,0,I-I can do it too<br>if I really try!,,223063005
|
||||
30010010,1,53010101,52,0,It's been a while<br>since I've had the chance to relax<br>like this with you. ♡,,223071504
|
||||
30010010,2,53010102,53,0,I know I can overcome anything<br>if it's for you...,,223071504
|
||||
30100009,1,53100091,52,0,"W-wait Lanzhu,<br>I don't think I'm quite ready—<br>WAAAA!",,223071504
|
||||
30100009,2,53100092,53,0,A whole new world opened up<br>after I met you.,,223071504
|
||||
30020009,1,53020091,52,0,He he he...<br>Who should I take down first? ♪,,223071506
|
||||
30020009,2,53020092,53,0,What do you think?<br>I thought of you when I picked out this dress. ♡,,223071506
|
||||
20060014,1,52060141,52,0,Thanks Zuramaru.<br>I'm really glad you're here.,,223071302
|
||||
20060014,2,52060142,53,0,"It's time to dance under the<br>bright blue sky! As my underling,<br>you need to make sure you're ready. ♪",,223071302
|
||||
40020010,1,54020101,52,0,Thank you!<br>I didn't think Sunny Pas would<br>wish me a happy birthday!,,223071703
|
||||
40020010,2,54020102,53,0,"With you, I'll keep on chasing my<br>big dreams...and make them come true!",,223071703
|
||||
40020012,1,54020121,52,0,The sparkling Christmas tree...<br>It's so pretty!,,223121506
|
||||
40020012,2,54020122,53,0,"Since you're being so good,<br>I'm gonna give you sooo<br>many presents!",,223121506
|
||||
10090016,1,51090161,52,0,"Oh, I can't play the piano...<br>Whoa, what're you doing Maki?!",,223072202
|
||||
10090016,2,51090162,53,0,My days have been filled with sunshine<br>ever since I met you!,,223072202
|
||||
10030016,1,51030161,52,0,I wish we could all do this<br>for the rest of time...,,223073103
|
||||
10030016,2,51030162,53,0,Don't let the summer heat<br>get your hype down! ♪,,223073103
|
||||
10050015,1,51050151,52,0,Woohoo!!!<br>This feels fanmeowstic! ♪,,223073103
|
||||
10050015,2,51050152,53,0,Today's a perfect day for the greatest concert ever! ♪<br>Let's keep it at full energy until the end!,,223073103
|
||||
10040016,1,51040161,52,0,Gah!<br>I'm not going to lose!,,223073105
|
||||
10040016,2,51040162,53,0,Could I maybe...make some<br>unforgettable summer memories with you?,,223073105
|
||||
40070010,1,54070101,52,0,Don't you cry!<br>I'll scoop up enough<br>for you and me!,,223081503
|
||||
40070010,2,54070102,53,0,Don't take your eyes off me!<br>Let this memory<br>reach deep inside and last forever!,,223081503
|
||||
40080010,1,54080101,52,0,Rifle angle...good.<br>Target position...good.<br>Physics trajectory calculation...complete. Shooting.,,223081503
|
||||
40080010,2,54080102,53,0,"Don't look at me, look at everyone else...<br>Especially Mei.",,223081503
|
||||
40080011,1,54080111,52,0,The Naumann's elephant<br>isn't a bad choice...,,223121509
|
||||
40080011,2,54080112,53,0,"I wanted to give you a stag beetle pupa<br>as a gift, but Mei told me to stop.<br>Too bad...",,223121509
|
||||
40010011,1,54010111,52,0,Look look! It's so pretty!<br>These memories will last a lifetime.,,223081505
|
||||
40010011,2,54010112,53,0,"There's a summer festival today!<br>Come on, come dance with me!",,223081505
|
||||
40010014,1,54010141,52,0,"And now a fun pose!<br>Nice, I got a good picture. ♪",,223121506
|
||||
40010014,2,54010142,53,0,Here's a present from me to you.<br>Will you accept?,,223121506
|
||||
20010015,1,52010151,52,0,"Hehe... Thanks, everyone.<br>I'm really...blessed. Zzz...",,223080103
|
||||
20010015,2,52010152,53,0,"Make sure to watch over<br>me, forever and ever!",,223080103
|
||||
20010019,1,52010191,52,0,"I wish to make even more wonderful memories<br>with everyone in Aqours this year.<br>Come on, everyone, make your wish!",,223123106
|
||||
20010019,2,52010192,53,0,HAPPY NEW YEAR!<br>I'm happy we got to<br>celebrate the new year together. ♪,,223123106
|
||||
10010017,1,51010171,52,0,This makes me so happy!<br>Thank you so much Kotori!<br>I'm going to keep it safe forever!,,223080304
|
||||
10010017,2,51010172,53,0,I think it's because of you that I can<br>shine so bright!,,223080304
|
||||
40090010,1,54090101,52,0,"Hey there Mr. Elephant,<br>how did your nose<br>get oh so long?!",,223080702
|
||||
40090010,2,54090102,53,0,"Hey, make sure to watch<br>me from now on!",,223080702
|
||||
30070009,1,53070091,52,0,You learned all my favorite<br>anime songs?!<br>That's so awesome!,,223080802
|
||||
30070009,2,53070092,53,0,"With you, I think<br>I can go anywhere.",,223080802
|
||||
20060015,1,52060151,52,0,Fallen Angel Yohane's Magic Eyes<br>are twinkling in the moonlight!,,223083103
|
||||
20060015,2,52060152,53,0,Little demons!<br>Dance away the night tonight<br>as my minions of darkness!,,223083103
|
||||
20060016,1,52060161,52,0,Uwaaahh!<br>Don't throw them so hard at me!,,224021403
|
||||
20060016,2,52060162,53,0,You've finally appeared!<br>I'll be the one to catch you!,,224021403
|
||||
20080014,1,52080141,52,0,"Kanan, Kanan!<br>I see stars next to the moon!",,223083103
|
||||
20080014,2,52080142,53,0,What do you think about me<br>as a cute little bunny rabbit?,,223083103
|
||||
20080016,1,52080161,52,0,"Now, let's face in the lucky direction<br>and eat up♪<br>No talking while you eat!",,224021406
|
||||
20080016,2,52080162,53,0,"Non non!<br>When you look at me that way,<br>you make me want to eat you!",,224021406
|
||||
20050014,1,52050141,52,0,Whoa! So cool!<br>Come take a look!<br>The wind is like a wave of light! ♪,,223083105
|
||||
20050014,2,52050142,53,0,*Hop* *hop* ♪<br>Come hop with me<br>and have some fun!,,223083105
|
||||
10060015,1,51060151,52,0,Hmm... The breeze feels so nice.,,223091503
|
||||
10060015,2,51060152,53,0,"I hope I can make today a<br>special day for you.<br>Watch me sing my best, okay?",,223091503
|
||||
10060017,1,51060171,52,0,"You want to see me skating?<br>...Fine, okay.",,224011503
|
||||
10060017,2,51060172,53,0,Being surrounded by flowers is so relaxing.<br>Don't you agree?,,224011503
|
||||
10060018,1,51060181,52,0,The spring night sky is beautiful too.<br>--……Ah! shooting star! ! !,,224031603
|
||||
10060018,2,51060182,53,0,I feel comfortable next to you.<br>……Say hello in the future.,,224031603
|
||||
10070017,1,51070171,52,0,"Look over here!<br>This way, Rin!<br>W-Whoa!",,223091503
|
||||
10070017,2,51070172,53,0,I bet you can't<br>take your eyes off of me!,,223091503
|
||||
10080016,1,51080161,52,0,Time to dig in!<br>*Munch* *munch*... So tasty! ♡,,223091505
|
||||
10080016,2,51080162,53,0,D-Do you think...<br>You'd like to dance with me today?,,223091505
|
||||
10080017,1,51080171,52,0,A-RISE's new song!<br>The lyrics and costumes and choreography<br>are all so good~!,,224011703
|
||||
10080017,2,51080172,53,0,Thanks for always supporting me!<br>I'll always support you too.,,224011703
|
||||
10030017,1,51030171,52,0,"Look, look!<br>I've always wanted to<br>dress up like a bunny! ♡",,223091202
|
||||
10030017,2,51030172,53,0,"Make sure to<br>keep watching over me, okay? ♡",,223091202
|
||||
10030018,1,51030181,52,0,I-It's so slippery... Eek!<br>Argh! It's so hard!,,224011503
|
||||
10030018,2,51030182,53,0,I made this bouquet<br>filled with all my gratitude for you.<br>Will you accept it?,,224011503
|
||||
20020014,1,52020141,52,0,Hi there Mr. Seagull!<br>Oh? Hehe. Is that tasty?,,223091902
|
||||
20020014,2,52020142,53,0,I hope you can be beside me when<br>I spread my wings to follow my dreams.,,223091902
|
||||
20020016,1,52020161,52,0,"...Okay, made the face!<br>Now to draw the horns...",,224021403
|
||||
20020016,2,52020162,53,0,...Oh? You're finally here?<br>It seems that<br>maybe you won't bore me.,,224021403
|
||||
20090014,1,52090141,52,0,My favorite...<br>sweet potato frappe!<br>Looks so yummy! ♡,,223092102
|
||||
20090014,2,52090142,53,0,I'll spread my wings with you<br>and fly toward a bright future. ♡,,223092102
|
||||
20090016,1,52090161,52,0,Toooooo cute! ♡<br>*pat* *pat*,,223123103
|
||||
20090016,2,52090162,53,0,Happy New Year!<br>Here's to spending<br>lot's of time with you. ♡,,223123103
|
||||
40040010,1,54040101,52,0,Found it!<br>The tastiest looking<br>melon in this greenhouse!,,223092802
|
||||
40040010,2,54040102,53,0,Don't you dare miss<br>the moment I shine!,,223092802
|
||||
40040013,1,54040131,52,0,Th-There isn't anything else to it.<br>I just wanted to thank you for everything.<br>That's all!,,224030106
|
||||
40040013,2,54040132,53,0,Got time after school?<br>Then come on a date with me♪,,224030106
|
||||
30120010,1,53120101,52,0,Wow! Look Ayumu! ♡<br>Cute little ghost pastries!,,223093003
|
||||
30120010,2,53120102,53,0,I just made the executive<br>decision that you'll be with<br>me for alllll time.,,223093003
|
||||
30120013,1,53120131,52,0,Do you like me?<br>I bet you really like me!<br>Hehe. I really like you too!,,223121902
|
||||
30120013,2,53120132,53,0,Do you like me?<br>I bet you really like me!<br>Hehe. I really like you too!,,223121902
|
||||
30120014,1,53120141,52,0,Wheeeee!♡<br>This is so much fun~!,,224021503
|
||||
30120014,2,53120142,53,0,The one who can thrill you the most<br>is Lanzhu!<br>No doubt about that!,,224021503
|
||||
30110010,1,53110101,52,0,Trick or Treat!<br>So? Did I scare you?,,223093003
|
||||
30110010,2,53110102,53,0,Just a second!<br>Don't pet me like that...,,223093003
|
||||
30030010,1,53030101,52,0,And I'll take this...over here...<br>All done!<br>I hope everyone likes this!,,223093005
|
||||
30030010,2,53030102,53,0,I'll play a trick even if you give me candy! ♡<br>Why? I'm just a little devil. ♪,,223093005
|
||||
20070015,1,52070151,52,0,L-Like this?<br>I hope the picture turns out okay.,,223101507
|
||||
20070015,2,52070152,53,0,I'm going to cast a little spell<br>so you can't take your eye's off of me zura! ♪,,223101507
|
||||
20070016,1,52070161,52,0,"Th-This is VR...!<br>It's the future, zura~!",,224030403
|
||||
20070016,2,52070162,53,0,"I want you<br>to always love me.<br>...Th-This is embarrassing, zura...",,224030403
|
||||
20040015,1,52040151,52,0,GYAAAAHHH!<br>Stop it!!!,,223101507
|
||||
20040015,2,52040152,53,0,How would you like to<br>experience some thrills with me?,,223101507
|
||||
20040016,1,52040161,52,0,"What am I going to wish for?<br>Of course, I'm going to wish for Ruby's happiness.",,224010104
|
||||
20040016,2,52040162,53,0,"I hope I can spend this year,<br>the start of next year,<br>and always with you.",,224010104
|
||||
20030015,1,52030151,52,0,W-What?! Huh?!<br>I think I see somethin—EEK!,,223101509
|
||||
20030015,2,52030152,53,0,Trick AND treat!<br>A surprise and a present for you! ♪,,223101509
|
||||
20030016,1,52030161,52,0,"These pancakes are so good!<br>Wait, you have a present for me too?!",,224021005
|
||||
20030016,2,52030162,53,0,A world with just the two of us<br>doesn't sound half bad.,,224021005
|
||||
30100010,1,53100101,52,0,"Oh yeah! The other day, Rina<br>and I made a dance video!",,223100503
|
||||
30100010,2,53100102,53,0,"I may still have lots to learn,<br>but please stay by me and watch over me.",,223100503
|
||||
10020017,1,51020171,52,0,C-Cute? Hmm...<br>Don't tease me like that.,,223102102
|
||||
10020017,2,51020172,53,0,"You're going to be with me<br>forever, right?<br>Hehe. That makes me happy.",,223102102
|
||||
40070011,1,54070111,52,0,"Hehehe... Hey now, that tickles!<br>Oh you want to climb up too?",,223102902
|
||||
40070011,2,54070112,53,0,I'm gonna do my absolute best...<br>So make sure to keep watching me!,,223102902
|
||||
40070013,1,54070131,52,0,This store's black tea<br>has been trending lately...<br>I hope that they'll like it!,,224030103
|
||||
40070013,2,54070132,53,0,I got a ton of cute snaps~<br>I'll send them to you later!,,224030103
|
||||
10040017,1,51040171,52,0,"Let's go, shall we?<br>Off to our own adventure!",,223100504
|
||||
20050015,1,52050151,52,0,A grand adventure with you?<br>I just can't stop my excitement!,,223101504
|
||||
30070011,1,53070111,52,0,My fiery passion just won't settle down!<br>It's time to start our great adventure!,,223101504
|
||||
40030011,1,54030111,52,0,"Okay, follow me!<br>I'll show you sights that<br>you've never seen before. ♪",,223101504
|
||||
30010012,1,53010121,52,0,"I'll keep a watch over you,<br>forever and always. ♪",,223100302
|
||||
30020011,1,53020111,52,0,"I'm always thinking about you first.<br>It's our little promise, okay?",,223101002
|
||||
30030012,1,53030121,52,0,Is your heart pounding like mine?<br>You know I...really like you too.,,223101702
|
||||
30040011,1,53040111,52,0,It may take some time...<br>but can you wait so I can<br>tell you how I really feel?,,223102402
|
||||
30050012,1,53050121,52,0,Did you know? My most favorite<br>time is the time I spend with you.,,223103102
|
||||
10040017,2,51040172,53,0,"Let's go, shall we?<br>Off to our own adventure!",,223100504
|
||||
20050015,2,52050152,53,0,A grand adventure with you?<br>I just can't stop my excitement!,,223101504
|
||||
20050017,1,52050171,52,0,"Mhmm, it's so good!<br>Wait, Mari, what is that?!",,223123103
|
||||
20050017,2,52050172,53,0,"With you by my side this year,<br>I have the feeling I'm going to pull the Super-Greatest-Best Fortune!",,223123103
|
||||
20050019,1,52050191,52,0,Peace!<br>Let's make a lot of memories!,,224031603
|
||||
20050019,2,52050192,53,0,... A feeling of happiness overflows<br>I'm sure it's because I'm with you.,,224031603
|
||||
30070011,2,53070112,53,0,My fiery passion just won't settle down!<br>It's time to start our great adventure!,,223101504
|
||||
40030011,2,54030112,53,0,"Okay, follow me!<br>I'll show you sights that<br>you've never seen before. ♪",,223101504
|
||||
30010012,2,53010122,53,0,"I'll keep a watch over you,<br>forever and always. ♪",,223100302
|
||||
30010017,1,53010171,52,0,"Here, open wide♡<br>What do you think?<br>Did it come out all right?",,224013106
|
||||
30010017,2,53010172,53,0,If I told you not to accept any chocolate<br>except for mine...<br>Would you?,,224013106
|
||||
30010018,1,53010181,52,0,I put this flower here...<br>Urm... I can't get the balance right.<br>Shioriko~!,,224030108
|
||||
30010018,2,53010182,53,0,You know... I want to keep chasing my dreams<br>together with you<br>now and forever♪,,224030108
|
||||
30020011,2,53020112,53,0,"I'm always thinking about you first.<br>It's our little promise, okay?",,223101002
|
||||
30020014,1,53020141,52,0,"Muahaha...<br>With Karin's makeup skills,<br>Kasumin will be sooooo much cuter!♡",,224012303
|
||||
30020014,2,53020142,53,0,"Senpai, I give you permanent residency<br>in the prosperous Kingdom of Kasumin♪<br>Now you can be together with Kasumin forever!♡",,224012303
|
||||
30030012,2,53030122,53,0,Is your heart pounding like mine?<br>You know I...really like you too.,,223101702
|
||||
30030014,1,53030141,52,0,"Okay, Ophelia?<br>Take this<br>and sit in front of Kasumi.",,224013103
|
||||
30030014,2,53030142,53,0,"I was always scared, but then you saved me.<br>Please keep taking me out<br>to see the whole wide world.",,224013103
|
||||
30030015,1,53030151,52,0,"Well done, Setsuna-san!<br>Your sharpness is different!<br>I can't lose either! ",,224031603
|
||||
30030015,2,53030152,53,0,"I'm ready to capture your heart!<br>Whether it's theater or school idols, I'll nail you♪I'll nail you♪ ",,224031603
|
||||
30040011,2,53040112,53,0,It may take some time...<br>but can you wait so I can<br>tell you how I really feel?,,223102402
|
||||
30050012,2,53050122,53,0,Did you know? My most favorite<br>time is the time I spend with you.,,223103102
|
||||
40030012,1,54030121,52,0,Good job with the information session!<br>Cheeeeerrrs!,,223103109
|
||||
40060011,1,54060111,52,0,"Ren, thanks a bunch!<br>I'll keep on tryin' my best!",,223103109
|
||||
40090011,1,54090111,52,0,I'd like to ask you all<br>about the appeal of Yuijo!,,223103106
|
||||
40030012,2,54030122,53,0,"Come join us!<br>Let's do this! 1, 2. 1, 2!",,223103109
|
||||
40030014,1,54030141,52,0,"Kanon, make a circle! A circle!<br>Come on! Come on! Hurry up!",,224022503
|
||||
40030014,2,54030142,53,0,"If you feel happy when you hear me sing<br>and watch me dance,<br>that's be the roundest thing♪",,224022503
|
||||
40060011,2,54060112,53,0,Let's make Yuijo<br>a great place together!,,223103109
|
||||
40060013,1,54060131,52,0,Hmm~♡ Potatoes in Tokyo<br> taste stylish!,,224031603
|
||||
40060013,2,54060132,53,0,I want you<br>to keep watching over Kinako.I'll do my best<br> to make you smile more!,,224031603
|
||||
40090011,2,54090112,53,0,Don't you dare miss out on my<br>brilliant techniques!,,223103106
|
||||
40100002,1,54100021,52,0,I'll sing a little<br>until everyone arrives.,,224012003
|
||||
40100002,2,54100022,53,0,I know you were moved by my song.<br>Tell me what you thought.,,224012003
|
||||
40110002,1,54110021,52,0,It is only logical for jellyfish to drift with the waves<br>due to their weak swimming ability.,,223122802
|
||||
40110002,2,54110022,53,0,I hope to keep on<br>brushing up on<br>my performance.,,223122802
|
||||
60010001,1,56010011,52,0,"I am the fortune-teller, Yohane.<br>Do you have any fortunes to be told?",,223121403
|
||||
60010001,2,56010012,53,0,I want to spread our songs across<br>this town and the entire world!,,223121403
|
||||
60020001,1,56020011,52,0,"I sell handmade<br>breads and desserts!<br>I recommend my Hanamaru Bread, zura!",,223121403
|
||||
60020001,2,56020012,53,0,"I just looove Yohane's songs<br>and singing with everyone, zura!",,223121403
|
||||
60030001,1,56030011,52,0,My name is Dia. I am<br>Executive Director General of the<br>Numazu Administrative Office.,,223121403
|
||||
60030001,2,56030012,53,0,I hope you enjoy my<br>whole-hearted devotion<br>to my song!,,223121403
|
||||
60040001,1,56040011,52,0,"I'm Ruby, nice to meet you.<br>My sister, is the Executive Director General<br>of the Administrative Office!",,223121403
|
||||
60040001,2,56040012,53,0,I hope you enjoy me<br>and the others sing!,,223121403
|
||||
60050001,1,56050011,52,0,Come right in!<br>I'm the poster girl for the Tochiman Ryokan!,,223121403
|
||||
60050001,2,56050012,53,0,"Let us give you a song that reaches your heart!<br>With Yohane and the others,<br>anything is possible!",,223121403
|
||||
60060001,1,56060011,52,0,"Hi there, I'm You!<br>I work as a messenger.<br>Leave all your deliveries to me!",,223121403
|
||||
60060001,2,56060012,53,0,We'll use our song to<br>show you how we feel!<br>I hope you listen and accept our feelings.,,223121403
|
||||
60070001,1,56070011,52,0,"I'm the recycling queen<br>of Uchira, Kanan!<br>I can take care of all your repairs!",,223121403
|
||||
60070001,2,56070012,53,0,Are you ready to have fun?<br>Let's make the best memories with everyone.,,223121403
|
||||
60080001,1,56080011,52,0,"I'm Riko, a zoologist.<br>You can ask me anything about animals.",,223121403
|
||||
60080001,2,56080012,53,0,I want you to hear<br>more of our songs.,,223121403
|
||||
60090001,1,56090011,52,0,The name's Mari. I've heard about you.<br>I always hear you talking.,,223121403
|
||||
60090001,2,56090012,53,0,"Yohane gives me courage.<br>I hope I can give someone strength, too!",,223121403
|
||||
30050013,1,53050131,52,0,"Mmmhmmm. This chicken is so good!<br>Hmm?!<br>Kasukasu, let's go over there!",,223111503
|
||||
30070013,1,53070131,52,0,I'm gonna give it my all!,,223111503
|
||||
30040012,1,53040121,52,0,"Welcome back, Young Miss.",,223111506
|
||||
30050013,2,53050132,53,0,"Master, master,<br>won't you play with me, meow? ♡<br>I'm just kitten ya!",,223111503
|
||||
30070013,2,53070132,53,0,Master's the only one I let just<br>pat me with their paws!,,223111503
|
||||
30040012,2,53040122,53,0,Look at me! Meow...<br>T-That's a little embarrassing!,,223111506
|
||||
30040014,1,53040141,52,0,"This chocolate is nice and sweet.<br>...Oh, please, Emma, stop recording!",,224013103
|
||||
30040014,2,53040142,53,0,"Maybe you've already caught on<br>to how I feel?<br>...Hehe, I love you.",,224013103
|
||||
10050016,1,51050161,52,0,"So many cute things around,<br>it's meowtastic! ♡",,223110102
|
||||
10050016,2,51050162,53,0,"Would you do something if I asked you?<br>For example...if I asked you to come,<br>would you come to me?",,223110102
|
||||
10050018,1,51050181,52,0,"Nico, let's go!<br>It's okay! I'm here for you!",,224011506
|
||||
10050018,2,51050182,53,0,Let's play tag!<br>Try and catch me!,,224011506
|
||||
30090012,1,53090121,52,0,"It's so fun with everyone!<br>Let's play some more, yeah?",,223111302
|
||||
30090012,2,53090122,53,0,Want to connect with me?,,223111302
|
||||
40050011,1,54050111,52,0,"Yummmmm. ♡<br>So many strawberries, everywhere!",,223112402
|
||||
40050011,2,54050112,53,0,Your support<br>makes my heart tremble!,,223112402
|
||||
40050013,1,54050131,52,0,How do you like them?<br>These scones with plenty<br>of my homemade jam?,,224030103
|
||||
40050013,2,54050132,53,0,"Th-This does feel somewhat embarrassing...<br>But wearing this,<br>I feel like I may find a new me!",,224030103
|
||||
30060011,1,53060111,52,0,"I noticed myself just always<br>thinking about you. For you,<br>I can do anything!",,223110702
|
||||
30070014,1,53070141,52,0,"If you need me to tell you 100 times or<br>1,000 times, so be it!<br>I really like you!",,223111402
|
||||
30080011,1,53080111,52,0,My memories with you<br>will always be treasures that I carry.,,223112102
|
||||
30090013,1,53090131,52,0,You really opened up my world.<br>Thank you so much!<br>I am so incredibly happy.,,223112802
|
||||
30060011,2,53060112,53,0,"I noticed myself just always<br>thinking about you. For you,<br>I can do anything!",,223110702
|
||||
30060013,1,53060131,52,0,No one can resist the kotatsu blanket table...<br>I've completely surrendered!,,223121602
|
||||
30060013,2,53060132,53,0,"Hey, come here!<br>Come lay down on my lap.<br>Maybe we can nap together?",,223121602
|
||||
30070014,2,53070142,53,0,"If you need me to tell you 100 times or<br>1,000 times, so be it!<br>I really like you!",,223111402
|
||||
30080011,2,53080112,53,0,My memories with you<br>will always be treasures that I carry.,,223112102
|
||||
30080014,1,53080141,52,0,It's my birthday!<br>I'm going to eat soooo much!,,224020503
|
||||
30080014,2,53080142,53,0,Does your heart all feel warm and fuzzy?<br>I really hope it does♪,,224020503
|
||||
30090013,2,53090132,53,0,You really opened up my world.<br>Thank you so much!<br>I am so incredibly happy.,,223112802
|
||||
30100013,1,53100131,52,0,Can I be selfish<br>for just one second?<br>I want to bond with you.,,223120502
|
||||
30110014,1,53110141,52,0,"I've never felt like this before.<br>Don't take your eyes off me, okay?",,223121202
|
||||
30100013,2,53100132,53,0,Can I be selfish<br>for just one second?<br>I want to bond with you.,,223120502
|
||||
30110014,2,53110142,53,0,"I've never felt like this before.<br>Don't take your eyes off me, okay?",,223121202
|
||||
10040019,1,51040191,52,0,Merry Christmas!<br>May joy find us all!,,223113010
|
||||
10090018,1,51090181,52,0,A small extra step goes<br>a long way in cooking!,,223113010
|
||||
10010020,1,51010201,52,0,"Wow, everyone<br>got me such great presents!",,223113006
|
||||
10040019,2,51040192,53,0,"If you're cold,<br>I can keep you warm.",,223113010
|
||||
10040020,1,51040201,52,0,Shhh... <br>Honoka fell asleep,,224031503
|
||||
10040020,2,51040202,53,0,I'll try to work hard from now on<br>to meet your expectations.,,224031503
|
||||
10090018,2,51090182,53,0,"You gotta keep warm!<br>Here, come closer.",,223113010
|
||||
10010020,2,51010202,53,0,I'm super happy I get to<br>spend this magical winter<br>sky with you!,,223113006
|
||||
30110013,1,53110131,52,0,For real?!<br>It's so awesome to get tips<br>on my batting form!,,223120602
|
||||
30110013,2,53110132,53,0,"It's because you stay by my side<br>that I'm able to put on my show.<br>Thanks, baby.",,223120602
|
||||
|
51
src/router/databases/csv-en/character.csv
Normal file
51
src/router/databases/csv-en/character.csv
Normal file
@@ -0,0 +1,51 @@
|
||||
_id,_name,_nameRuby,_detailText,_category,_schoolGrade,_charaCategory,_masterGroupId,_spriteName,_displayOrder,_height,_bloodType,_birsday,_voiceActor,_imageColor,_imageColorDark,_nameRichtextGacha,_masterReleaseLabelId
|
||||
1001,Honoka Kosaka,Honoka Kosaka,The founder of μ's. Honoka always has a smile on her face and a spring in her step. Her unshakably positive outlook carries her through any hardships she may face.,1,2,1,101,1001,1001,157 cm,O,Aug 3,Emi Nitta,FF9210,FF9210,<size=100>H<size=80>onoka<size=100>K<size=80>osaka,1
|
||||
1002,Eli Ayase,Eli Ayase,"Eli is one-quarter Russian. She's an intelligent, athletic, naturally gifted girl who quickly masters anything she puts her mind to. Her strong sense of responsibility and popularity at school make Eli a natural fit as student council president.",1,3,1,103,1002,1002,162 cm,B,Oct 21,Yoshino Nanjo,47C3FB,47C3FB,<size=100>E<size=80>li<size=100>A<size=80>yase,1
|
||||
1003,Kotori Minami,Kotori Minami,"Kotori is a gentle, laid-back girl and also an excellent student. Though she has an easygoing personality, Kotori has a strong backbone and never lets herself be intimidated. She and Honoka are best friends.",1,2,1,101,1003,1003,159 cm,O,Sep 12,Aya Uchida,BAB3B3,BAB3B3,<size=100>K<size=80>otori<size=100>M<size=80>inami,1
|
||||
1004,Umi Sonoda,Umi Sonoda,"An elegant young lady with impeccable manners. Umi has practiced archery since she was a young girl. She detests wrongdoing and laziness. Umi, Honoka, and Kotori have been friends since they were little.",1,2,1,102,1004,1004,159 cm,A,Mar 15,Suzuko Mimori,226BF1,226BF1,<size=100>U<size=80>mi<size=100>S<size=80>onoda,1
|
||||
1005,Rin Hoshizora,Rin Hoshizora,"Rin is a cheerful and athletic girl who's more the type to get up and get a move on rather than sit around worrying about things. She's caring and always looks out for Hanayo, her childhood friend.",1,1,1,102,1005,1005,155 cm,A,Nov 1,Riho Iida,FCD500,CEAE00,<size=100>R<size=80>in<size=100>H<size=80>oshizora,1
|
||||
1006,Maki Nishikino,Maki Nishikino,"Maki is prideful, a bit overbearing, and struggles to show her true feelings. She's not afraid to stand up for herself or others, even when dealing with older students. Despite her tough exterior, she sometimes feels a bit lonely.",1,1,1,103,1006,1006,161 cm,AB,Apr 19,Pile,F14747,F14747,<size=100>M<size=80>aki<size=100>N<size=80>ishikino,1
|
||||
1007,Nozomi Tojo,Nozomi Tojo,"A free spirit, her Kansai dialect gives her a somewhat unique way of speaking. Nozomi is quite easygoing but often comes across as the most mature member of μ's.",1,3,1,102,1007,1007,159 cm,O,June 9,Aina Kusuda,C355E8,C355E8,<size=100>N<size=80>ozomi<size=100>T<size=80>ojo,1
|
||||
1008,Hanayo Koizumi,Hanayo Koizumi,Hanayo is a quiet girl who rarely stands out in class. She lacks self-confidence and tends to give up easily. White rice is Hanayo's favorite food.,1,1,1,101,1008,1008,156 cm,B,Jan 17,Yurika Kubo,44CF72,44CF72,<size=100>H<size=80>anayo<size=100>K<size=80>oizumi,1
|
||||
1009,Nico Yazawa,Nico Yazawa,"Nico is a true-blue idol fanatic who strives morning, noon, and night to become a full-fledged idol herself. Her catchphrase is ""Nico-Nico-Ni!""",1,3,1,103,1009,1009,154 cm,A,Jul 22,Sora Tokui,FF548F,FF548F,<size=100>N<size=80>ico<size=100>Y<size=80>azawa,1
|
||||
2001,Chika Takami,Chika Takami,"The founder of Aqours. Chika is cheerful and friendly, but also extremely competitive. Her bold personality tends to get her and her friends wrapped up in all sorts of interesting situations.",2,2,1,201,2001,2001,157 cm,B,Aug 1,Anju Inami,FF700F,FF700F,<size=100>C<size=80>hika<size=100>T<size=80>akami,1
|
||||
2002,Riko Sakurauchi,Riko Sakurauchi,"At first glance, Riko seems like a calm, cool, and collected young lady. However, she gets flustered easily and is prone to misreading situations.",2,2,1,203,2002,2002,160 cm,A,Sep 19,Rikako Aida,FB697E,FB697E,<size=100>R<size=80>iko<size=100>S<size=80>akurauchi,1
|
||||
2003,Kanan Matsuura,Kanan Matsuura,"Kanan is a frank, mature girl who doesn't sweat the small stuff. She's calm under pressure and always has a cool, collected air about her.",2,3,1,202,2003,2003,162 cm,O,Feb 10,Nanaka Suwa,02D09D,02D09D,<size=100>K<size=80>anan<size=100>M<size=80>atsuura,1
|
||||
2004,Dia Kurosawa,Dia Kurosawa,"Dia is the daughter of a well-known fishing family. She's also the student council president. A perfectionist and proud of it, Dia doesn't abide by half-hearted efforts or slipshod results.",2,3,1,202,2004,2004,162 cm,A,Jan 1,Arisa Komiya,E0083B,E0083B,<size=100>D<size=80>ia<size=100>K<size=80>urosawa,1
|
||||
2005,You Watanabe,You Watanabe,"You's first instinct is always to act first and ask questions later. Her father is the captain of a ferryboat, and she hopes to follow in his footsteps and captain her own boat someday.",2,2,1,201,2005,2005,157 cm,AB,Apr 17,Shuka Saito,07B0E8,07B0E8,<size=100>Y<size=80>ou<size=100>W<size=80>atanabe,1
|
||||
2006,Yoshiko Tsushima,Yoshiko Tsushima,"Perpetually garbed in devilish attire, Yoshiko refers to herself as ""Yohane, the Fallen Angel."" Her hometown is Numazu City. She's peppy and brash, but also smart and witty. Unfortunately, Yoshiko has very bad luck and trouble seems to follow her.",2,1,1,203,2006,2006,156 cm,O,Jul 13,Aika Kobayashi,A9ACB2,A9ACB2,<size=100>Y<size=80>oshiko<size=100>T<size=80>sushima,1
|
||||
2007,Hanamaru Kunikida,Hanamaru Kunikida,A bookworm with an affinity for Japanese literature. Hanamaru is a gifted singer and performs in a choir. She's an astute girl who's attentive and considerate of others.,2,1,1,202,2007,2007,152 cm,O,Mar 4,Kanako Takatsuki,FFC000,FFC000,<size=100>H<size=80>anamaru<size=100>K<size=80>unikida,1
|
||||
2008,Mari Ohara,Mari Ohara,"Mari is motivated, and energetic, and often acts independently. She is fearless and never backs down from a challenge. Her father is Italian-American and runs a world-class hotel chain.",2,3,1,203,2008,2008,163 cm,AB,Jun 13,Aina Suzuki,A132D9,A132D9,<size=100>M<size=80>ari<size=100>O<size=80>hara,1
|
||||
2009,Ruby Kurosawa,Ruby Kurosawa,"Though timid and somewhat of a crybaby, Ruby is the daughter of a prestigious family, which has imbued her with strong core values. She has always admired idols. Ruby's one major point of pride is her skill with a needle and thread.",2,1,1,201,2009,2009,154 cm,A,Sep 21,Ai Furihata,F143B4,F143B4,<size=100>R<size=80>uby<size=100>K<size=80>urosawa,1
|
||||
3001,Ayumu Uehara,Ayumu Uehara,Ayumu is diligent and hardworking. A certain event from her past set her on the path to becoming a school idol.,3,2,1,302,3001,3001,159 cm,A,Mar 1,Aguri Onishi,F48099,F48099,<size=100>A<size=80>yumu<size=100>U<size=80>ehara,1
|
||||
3002,Kasumi Nakasu,Kasumi Nakasu,"Lover of all things cute, Kasumi adores school idols more than just about anyone. She's fiercely competitive, and gets angry when people call her by the nickname ""Kasukasu.""",3,1,1,303,3002,3002,155 cm,B,Jan 23,Mayu Sagara,EDDC00,D5C500,<size=100>K<size=80>asumi<size=100>N<size=80>akasu,1
|
||||
3003,Shizuku Osaka,Shizuku Osaka,"Highly responsible, Shizuku maintains her excellent grades despite being a member of both the drama club and the school idol club.",3,1,1,302,3003,3003,157 cm,A,Apr 3,Kaori Maeda,2CAED5,2CAED5,<size=100>S<size=80>hizuku<size=100>O<size=80>saka,1
|
||||
3004,Karin Asaka,Karin Asaka,"A magazine model in her free time, Karin appears much older and more mature than a typical high schooler. Though she may look and often act like an adult, there's a surprisingly innocent side to her personality too.",3,3,1,301,3004,3004,167 cm,AB,Jun 29,Miyu Kubota,4A62D2,4A62D2,<size=100>K<size=80>arin<size=100>A<size=80>saka,1
|
||||
3005,Ai Miyashita,Ai Miyashita,"Ai is a naturally gifted athlete and helps out multiple teams as a sub. She always goes with the flow and has a caring personality. Put it all together, and it's no wonder Ai is friends with just about everyone.",3,2,1,301,3005,3005,163 cm,A,May 30,Natsumi Murakami,F6663E,F6663E,<size=100>A<size=80>i<size=100>M<size=80>iyashita,1
|
||||
3006,Kanata Konoe,Kanata Konoe,"Though Kanata usually seems to be on the verge of dozing off, she gets fired up when it comes to cooking and caring for her little sister.",3,3,1,303,3006,3006,158 cm,O,Dec 16,Akari Kito,A96398,A96398,<size=100>K<size=80>anata<size=100>K<size=80>onoe,1
|
||||
3007,Setsuna Yuki,Setsuna Yuki,"A school idol who gives powerful, fiery performances and always has a smile on her face. Setsuna is so busy with her school idol activities that there are even rumors that no one has ever actually seen her at school.",3,2,1,302,3007,3007,154 cm,O,Aug 8,Coco Hayashi,DC2235,DC2235,<size=100>S<size=80>etsuna<size=100>Y<size=80>uki,1
|
||||
3008,Emma Verde,Emma Verde,"Emma is an exchange student from Switzerland who adores school idols. She is kind, easygoing, and has a deep love for the mountains and nature of her hometown.",3,3,1,303,3008,3008,166 cm,O,Feb 5,Maria Sashide,7EC36E,7EC36E,<size=100>E<size=80>mma<size=100>V<size=80>erde,1
|
||||
3009,Rina Tennoji,Rina Tennoji,"Rina has trouble conveying her emotions with facial expressions, so some people tend to see her as cold and aloof. But in reality, Rina is very friendly and has an impassioned heart.",3,1,1,303,3009,3009,149 cm,B,Nov 13,Chiemi Tanaka,A0A3BC,A0A3BC,<size=100>R<size=80>ina<size=100>T<size=80>ennoji,1
|
||||
3010,Shioriko Mifune,Shioriko Mifune,"Proper and serious, Shioriko always works for the greater good. She has been friends with Lanzhu since they were little.",3,1,1,304,3010,3010,160 cm,AB,Oct 5,Moeka Koizumi,37C4A1,37C4A1,<size=100>S<size=80>hioriko<size=100>M<size=80>ifune,1
|
||||
3011,Mia Taylor,Mia Taylor,"Mia is an exchange student from NYC. The daughter of the world-famous Taylor family of musicians, Mia has skipped several grades and is now a senior despite being only 14 years old.",3,3,1,304,3011,3011,156 cm,AB,Dec 6,Shu Uchida,D7D6C9,B3B098,<size=100>M<size=80>ia<size=100>T<size=80>aylor,1
|
||||
3012,Lanzhu Zhong,Lanzhu Zhong,An exchange student from Hong Kong. Lanzhu is a bit of a prima donna who seems to be perfect at everything. Her favorite food is meat.,3,2,1,304,3012,3012,165 cm,B,Feb 15,Akina Homoto,F7CBC7,E2B0AC,<size=100>L<size=80>anzhu<size=100>Z<size=80>hong,1
|
||||
4001,Kanon Shibuya,Kanon Shibuya,"Though shy, Kanon genuinely loves singing from the bottom of her heart. She possesses a strong sense of empathy that helps her understand the feelings of others and is often the one propelling Liella! forward.",4,2,1,403,4001,4001,159 cm,A,May 1,Sayuri Date,F57924,F57924,<size=100>K<size=80>anon<size=100>S<size=80>hibuya,1
|
||||
4002,Keke Tang,Keke Tang,"A girl from Shanghai who came to study at Yuigaoka Girls' High School. Keke is a passionate young lady with a singular focus on the things she cares about. She especially loves cute things. Keke is Liella!'s bright, burning sun.",4,2,1,404,4002,4002,159 cm,O,Jul 17,Liyuu,85EDEC,29E2E0,<size=100>K<size=80>eke<size=100>T<size=80>ang,1
|
||||
4003,Chisato Arashi,Chisato Arashi,Chisato has been best friends with Kanon since childhood. Her devoted and hardworking personality makes her very likable. She's in charge of choreography for Liella! and strives to level up their dancing skills. Chisato adores all things round.,4,2,1,405,4003,4003,155 cm,B,Feb 25,Nako Misaki,FF6E97,FF6E97,<size=100>C<size=80>hisato<size=100>A<size=80>rashi,1
|
||||
4004,Sumire Heanna,Sumire Heanna,"Sumire can seem condescending and stubborn, but she's a kind girl who knows when others are feeling down. She's the wild card of Liella!, often revealing surprising skills at critical moments. Sumire's family lives in a shrine near the school.",4,2,1,403,4004,4004,161 cm,AB,Sep 28,Naomi Payton,70ED62,60E251,<size=100>S<size=80>umire<size=100>H<size=80>eanna,1
|
||||
4005,Ren Hazuki,Ren Hazuki,"Daughter of the founder of Yuigaoka Girls' High School. Ren is Liella!'s ace and has practiced piano and figure skating since she was a kid. Her calm demeanor makes her a popular student council president, but she can be a bit naive.",4,2,1,404,4005,4005,163 cm,A,Nov 24,Nagisa Aoyama,2020AB,2020AB,<size=100>R<size=80>en<size=100>H<size=80>azuki,1
|
||||
4006,Kinako Sakurakoji,Kinako Sakurakoji,"Buoyant, big-hearted, and always amicable. In a word, Kinako is sweet. She decided to step out on her own and attend high school in Tokyo, enrolling at Yuigaoka.",4,1,1,405,4006,4006,159 cm,O,Apr 10,Nozomi Suzuhara,F6EB41,C9BF29,<size=100>K<size=80>inako<size=100>S<size=80>akurakoji,1
|
||||
4007,Mei Yoneme,Mei Yoneme,"Mei is a bit of a cynic. On the surface, she seems like a delinquent who's difficult to approach. However, she has a strong sense of justice and stands up for what is right when she feels something is wrong.",4,1,1,403,4007,4007,155 cm,A,Oct 29,Akane Yabushima,F93535,F93535,<size=100>M<size=80>ei<size=100>Y<size=80>oneme,1
|
||||
4008,Shiki Wakana,Shiki Wakana,"Shiki is a girl of few words who even as a child preferred to play alone. She is calm and collected, rarely verbalizing her feelings. While this makes her seem mysterious, her feelings toward her fellow members are stronger than anyone's.",4,1,1,405,4008,4008,161 cm,B,Jun 17,Wakana Ookuma,B4F6D8,75AD88,<size=100>S<size=80>hiki<size=100>W<size=80>akana,1
|
||||
4009,Natsumi Onitsuka,Natsumi Onitsuka,"Natsumi is optimistic and proactive, with a keen eye for fashion. She's the type of girl who's always up for a challenge and will do whatever it takes to achieve her goals. She often tries to control things from behind the scenes.",4,1,1,405,4009,4009,152 cm,AB,Aug 7,Aya Emori,FC3ABA,FC3ABA,<size=100>N<size=80>atsumi<size=100>O<size=80>nitsuka,1
|
||||
4010,Wien Margarete,Wien Margarete,"A girl from Austria studying in Japan. She transferred to Yuigaoka Girls' High School to be a part of Love Live! Margarete has a great sense of music and a powerful singing voice, with an overly competitive character that sometimes clashes with those around her.",4,1,1,404,4010,4010,161 cm,A,Jan 20,Yuina,E09FF7,E09FF7,<size=100>W<size=80>ien <size=100>M<size=80>argarete,223121502
|
||||
4011,Tomari Onitsuka,Tomari Onitsuka,"She tries to be efficient and hates wasteful things. Tomari tends to analyze things strictly and has a cold eye toward things that are difficult to accomplish. She loves her older sister, Natsumi.",4,1,1,405,4011,4011,163 cm,B,Dec 28,Sakura Sakakura,4CD2E2,4CD2E2,<size=100>T<size=80>omari <size=100>O<size=80>nitsuka,223121502
|
||||
6001,Yohane,Yohane,"A girl who runs a fortune-telling shop in Numazu. She is a stickler with a peculiar temperament, however kind at heart and never refuses a request.",6,0,1,9901,6001,6001,156 cm,-,Jul 13,Aika Kobayashi,A9ACB2,A9ACB2,<size=100>Y<size=80>ohane,223121403
|
||||
6002,Hanamaru,Hanamaru,Yohane's childhood friend. She loves delicious food and makes her living selling homemade sweets at a food stall.,6,0,1,9901,6002,6002,152 cm,-,Mar 4,Kanako Takatsuki,FFC000,FFC000,<size=100>H<size=80>anamaru,223121403
|
||||
6003,Dia,Dia,The head of the Numazu Administrative Office. She is a perfectionist who does not tolerate anything that is out of bounds.,6,0,1,9901,6003,6003,162 cm,-,Jan 1,Arisa Komiya,E0083B,E0083B,<size=100>D<size=80>ia,223121403
|
||||
6004,Ruby,Ruby,A descendant of the fairies. She has a reclusive personality and lives so people cannot find her.,6,0,1,9901,6004,6004,Five tangerines,-,Sep 21,Ai Furihata,F143B4,F143B4,<size=100>R<size=80>ubi,223121403
|
||||
6005,Chika,Chika,The youngest of three sisters and the poster girl of a long-established Ryokan inn in the Uchira district. She is shy and competitive.,6,0,1,9901,6005,6005,157 cm,-,Aug 1,Anju Inami,FF700F,FF700F,<size=100>C<size=80>hika,223121403
|
||||
6006,You,You,"A girl who works as a messenger in Numazu. She is always cheerful, energetic, and unapologetically athletic.",6,0,1,9901,6006,6006,157 cm,-,Apr 17,Shuka Saito,07B0E8,07B0E8,<size=100>Y<size=80>ou,223121403
|
||||
6007,Kanon,Kanon,A mechanic who runs a workshop in the Uchira district. She makes her living repairing and crafting using junk picked out of the ocean.,6,0,1,9901,6007,6007,162 cm,-,Feb 10,Nanaka Suwa,02D09D,02D09D,<size=100>K<size=80>anan,223121403
|
||||
6008,Riko,Riko,"A zoologist from outside Numazu. She has a calm personality, but is very inquisitive and does not mind pretending to be something she is not.",6,0,1,9901,6008,6008,160 cm,-,Sep 19,Rikako Aida,FB697E,FB697E,<size=100>R<size=80>iko,223121403
|
||||
6009,Mari,Mari,A descendant of the Demon King family that lives in a castle on Wassimer Island. She is not often seen in public.,6,0,1,9901,6009,6009,163 cm,-,Jun 13,Aina Suzuki,A132D9,A132D9,<size=100>M<size=80>ari,223121403
|
||||
|
101
src/router/databases/csv-en/character_group.csv
Normal file
101
src/router/databases/csv-en/character_group.csv
Normal file
@@ -0,0 +1,101 @@
|
||||
_characterId,_groupId,_masterReleaseLabelId
|
||||
1001,100,1
|
||||
1001,101,1
|
||||
1002,100,1
|
||||
1002,103,1
|
||||
1003,100,1
|
||||
1003,101,1
|
||||
1004,100,1
|
||||
1004,102,1
|
||||
1005,100,1
|
||||
1005,102,1
|
||||
1006,100,1
|
||||
1006,103,1
|
||||
1007,100,1
|
||||
1007,102,1
|
||||
1008,100,1
|
||||
1008,101,1
|
||||
1009,100,1
|
||||
1009,103,1
|
||||
2001,200,1
|
||||
2001,201,1
|
||||
2002,200,1
|
||||
2002,203,1
|
||||
2003,200,1
|
||||
2003,202,1
|
||||
2004,200,1
|
||||
2004,202,1
|
||||
2005,200,1
|
||||
2005,201,1
|
||||
2006,200,1
|
||||
2006,203,1
|
||||
2007,200,1
|
||||
2007,202,1
|
||||
2008,200,1
|
||||
2008,203,1
|
||||
2009,200,1
|
||||
2009,201,1
|
||||
3001,300,1
|
||||
3001,302,1
|
||||
3002,300,1
|
||||
3002,303,1
|
||||
3003,300,1
|
||||
3003,302,1
|
||||
3004,300,1
|
||||
3004,301,1
|
||||
3005,300,1
|
||||
3005,301,1
|
||||
3006,300,1
|
||||
3006,303,1
|
||||
3007,300,1
|
||||
3007,302,1
|
||||
3008,300,1
|
||||
3008,303,1
|
||||
3009,300,1
|
||||
3009,303,1
|
||||
3010,300,1
|
||||
3010,304,1
|
||||
3011,300,1
|
||||
3011,304,1
|
||||
3012,300,1
|
||||
3012,304,1
|
||||
4001,400,1
|
||||
4002,400,1
|
||||
4003,400,1
|
||||
4004,400,1
|
||||
4005,400,1
|
||||
4006,400,1
|
||||
4007,400,1
|
||||
4008,400,1
|
||||
4009,400,1
|
||||
4001,403,223101004
|
||||
4002,404,223101004
|
||||
4003,405,223101004
|
||||
4004,403,223101004
|
||||
4005,404,223101004
|
||||
4006,405,223101004
|
||||
4007,403,223101004
|
||||
4008,405,223101004
|
||||
4009,405,223101004
|
||||
4010,400,223121502
|
||||
4010,404,223121502
|
||||
4011,400,223121502
|
||||
4011,405,223121502
|
||||
6001,9901,223121403
|
||||
6001,9999,223121403
|
||||
6002,9901,223121403
|
||||
6002,9999,223121403
|
||||
6003,9901,223121403
|
||||
6003,9999,223121403
|
||||
6004,9901,223121403
|
||||
6004,9999,223121403
|
||||
6005,9901,223121403
|
||||
6005,9999,223121403
|
||||
6006,9901,223121403
|
||||
6006,9999,223121403
|
||||
6007,9901,223121403
|
||||
6007,9999,223121403
|
||||
6008,9901,223121403
|
||||
6008,9999,223121403
|
||||
6009,9901,223121403
|
||||
6009,9999,223121403
|
||||
|
4599
src/router/databases/csv-en/character_sys_voice.csv
Normal file
4599
src/router/databases/csv-en/character_sys_voice.csv
Normal file
File diff suppressed because it is too large
Load Diff
47
src/router/databases/csv-en/chat.csv
Normal file
47
src/router/databases/csv-en/chat.csv
Normal file
@@ -0,0 +1,47 @@
|
||||
_id,_title,_type,_category,_chatCharaId,_bgColorCode,_headerColorCode,_masterReleaseLabelId
|
||||
1001,穂乃果,0,1,1001,FF9210,FF9210,1
|
||||
1002,絵里,0,1,1002,47C3FB,47C3FB,1
|
||||
1003,ことり,0,1,1003,BAB3B3,BAB3B3,1
|
||||
1004,海未,0,1,1004,226BF1,226BF1,1
|
||||
1005,凛,0,1,1005,FCD500,FCD500,1
|
||||
1006,真姫,0,1,1006,F14747,F14747,1
|
||||
1007,希,0,1,1007,C355E8,C355E8,1
|
||||
1008,花陽,0,1,1008,44CF72,44CF72,1
|
||||
1009,にこ,0,1,1009,FF548F,FF548F,1
|
||||
1101,μ’s,1,1,0,F1399F,F1399F,1
|
||||
2001,千歌,0,2,2001,FF700F,FF700F,1
|
||||
2002,梨子,0,2,2002,FB697E,FB697E,1
|
||||
2003,果南,0,2,2003,02D09D,02D09D,1
|
||||
2004,ダイヤ,0,2,2004,E0083B,E0083B,1
|
||||
2005,曜,0,2,2005,07B0E8,07B0E8,1
|
||||
2006,善子,0,2,2006,A9ACB2,A9ACB2,1
|
||||
2007,花丸,0,2,2007,FFC000,FFC000,1
|
||||
2008,鞠莉,0,2,2008,A132D9,A132D9,1
|
||||
2009,ルビィ,0,2,2009,F143B4,F143B4,1
|
||||
2101,Aqours,1,2,0,009DE5,009DE5,1
|
||||
3001,歩夢,0,3,3001,F48099,F48099,1
|
||||
3002,かすみ,0,3,3002,E4D200,EDDC00,1
|
||||
3003,しずく,0,3,3003,2CAED5,2CAED5,1
|
||||
3004,果林,0,3,3004,4A62D2,4A62D2,1
|
||||
3005,愛,0,3,3005,F6663E,F6663E,1
|
||||
3006,彼方,0,3,3006,A96398,A96398,1
|
||||
3007,せつ菜,0,3,3007,DC2235,DC2235,1
|
||||
3008,エマ,0,3,3008,7EC36E,7EC36E,1
|
||||
3009,璃奈,0,3,3009,A0A3BC,A0A3BC,1
|
||||
3010,栞子,0,3,3010,37C4A1,37C4A1,1
|
||||
3011,ミア,0,3,3011,B6B5A8,D7D6C9,1
|
||||
3012,嵐珠,0,3,3012,EAB1AD,F7CBC7,1
|
||||
3099,侑,0,3,3099,303030,303030,323082802
|
||||
3101,ニジガク,1,3,0,FDAB0D,FDAB0D,1
|
||||
4001,かのん,0,4,4001,F57924,F57924,1
|
||||
4002,可可,0,4,4002,7CE8E6,85EDEC,1
|
||||
4003,千砂都,0,4,4003,FF6E97,FF6E97,1
|
||||
4004,すみれ,0,4,4004,70ED62,70ED62,1
|
||||
4005,恋,0,4,4005,2020AB,2020AB,1
|
||||
4006,きな子,0,4,4006,F6EB41,F6EB41,1
|
||||
4007,メイ,0,4,4007,F93535,F93535,1
|
||||
4008,四季,0,4,4008,9FE9C7,B4F6D8,1
|
||||
4009,夏美,0,4,4009,FC3ABA,FC3ABA,1
|
||||
4010,マルガレーテ,0,4,4010,E09FF7,E09FF7,223121502
|
||||
4011,冬毬,0,4,4011,4CD2E2,4CD2E2,223121502
|
||||
4101,Liella!,1,4,0,C04ABE,C04ABE,1
|
||||
|
85
src/router/databases/csv-en/chat_attachment.csv
Normal file
85
src/router/databases/csv-en/chat_attachment.csv
Normal file
@@ -0,0 +1,85 @@
|
||||
_id,_filename,_masterReleaseLabelId
|
||||
1,attach_f_01_0001,1
|
||||
2,attach_f_01_0002,1
|
||||
3,attach_f_01_0003,1
|
||||
4,attach_f_01_0004,1
|
||||
5,attach_f_01_0005,1
|
||||
6,attach_f_01_0006,1
|
||||
7,attach_f_01_0007,1
|
||||
8,attach_f_01_0008,1
|
||||
9,attach_f_01_0009,1
|
||||
10,attach_f_01_0010,1
|
||||
11,attach_f_01_0011,1
|
||||
12,attach_f_01_0012,1
|
||||
13,attach_f_01_0013,1
|
||||
14,attach_f_01_0014,1
|
||||
15,attach_f_01_0015,1
|
||||
16,attach_f_01_0016,1
|
||||
17,attach_f_01_0017,1
|
||||
18,attach_f_01_0018,1
|
||||
19,attach_f_01_0019,1
|
||||
20,attach_f_01_0020,1
|
||||
21,attach_f_02_0001,1
|
||||
22,attach_f_02_0002,1
|
||||
23,attach_f_02_0003,1
|
||||
24,attach_f_02_0004,1
|
||||
25,attach_f_02_0005,1
|
||||
26,attach_f_02_0006,1
|
||||
27,attach_f_02_0007,1
|
||||
28,attach_f_02_0008,1
|
||||
29,attach_f_02_0009,1
|
||||
30,attach_f_02_0010,1
|
||||
31,attach_f_02_0011,1
|
||||
32,attach_f_03_0001,1
|
||||
33,attach_f_03_0002,1
|
||||
34,attach_f_03_0003,1
|
||||
35,attach_f_03_0004,1
|
||||
36,attach_f_03_0005,1
|
||||
37,attach_f_03_0006,1
|
||||
38,attach_f_03_0007,1
|
||||
39,attach_f_03_0008,1
|
||||
40,attach_f_03_0009,1
|
||||
41,attach_f_03_0010,1
|
||||
42,attach_f_03_0011,1
|
||||
43,attach_f_03_0012,1
|
||||
44,attach_f_03_0013,1
|
||||
45,attach_f_03_0014,1
|
||||
46,attach_f_03_0015,1
|
||||
47,attach_f_03_0016,1
|
||||
48,attach_f_03_0017,1
|
||||
49,attach_f_03_0018,1
|
||||
50,attach_f_03_0019,1
|
||||
51,attach_f_03_0020,1
|
||||
52,attach_f_03_0021,1
|
||||
53,attach_f_03_0022,1
|
||||
54,attach_f_03_0023,1
|
||||
55,attach_f_03_0024,1
|
||||
56,attach_f_04_0001,1
|
||||
57,attach_f_04_0002,1
|
||||
58,attach_f_04_0003,1
|
||||
59,attach_f_04_0004,1
|
||||
60,attach_f_04_0005,1
|
||||
61,attach_f_04_0006,1
|
||||
62,attach_f_04_0007,1
|
||||
63,attach_f_04_0008,1
|
||||
64,attach_f_04_0009,1
|
||||
65,attach_f_04_0010,1
|
||||
66,attach_f_04_0011,1
|
||||
67,attach_f_02_0012,1
|
||||
68,attach_f_02_0013,1
|
||||
69,attach_f_02_0014,1
|
||||
70,attach_f_04_0012,123061702
|
||||
71,attach_f_04_0013,123061702
|
||||
72,attach_f_03_0025,123062902
|
||||
73,attach_f_02_0015,123071302
|
||||
74,attach_f_02_0016,123092102
|
||||
75,attach_f_04_0014,123102902
|
||||
76,attach_f_04_0015,323121501
|
||||
77,attach_f_04_0016,323121501
|
||||
78,attach_f_02_0017,124010103
|
||||
79,attach_f_03_0026,124020502
|
||||
80,attach_f_04_0017,124022502
|
||||
81,attach_f_03_0027,124021502
|
||||
82,attach_f_01_0021,324031601
|
||||
83,attach_f_02_0018,324031602
|
||||
84,attach_f_03_0028,324031603
|
||||
|
1336
src/router/databases/csv-en/chat_chapter.csv
Normal file
1336
src/router/databases/csv-en/chat_chapter.csv
Normal file
File diff suppressed because it is too large
Load Diff
43
src/router/databases/csv-en/chat_character.csv
Normal file
43
src/router/databases/csv-en/chat_character.csv
Normal file
@@ -0,0 +1,43 @@
|
||||
_id,_characterId,_group,_name,_masterReleaseLabelId
|
||||
1001,1001,100,Honoka,1
|
||||
1002,1002,100,Eli,1
|
||||
1003,1003,100,Kotori,1
|
||||
1004,1004,100,Umi,1
|
||||
1005,1005,100,Rin,1
|
||||
1006,1006,100,Maki,1
|
||||
1007,1007,100,Nozomi,1
|
||||
1008,1008,100,Hanayo,1
|
||||
1009,1009,100,Nico,1
|
||||
2001,2001,200,Chika,1
|
||||
2002,2002,200,Riko,1
|
||||
2003,2003,200,Kanan,1
|
||||
2004,2004,200,Dia,1
|
||||
2005,2005,200,You,1
|
||||
2006,2006,200,Yoshiko,1
|
||||
2007,2007,200,Hanamaru,1
|
||||
2008,2008,200,Mari,1
|
||||
2009,2009,200,Ruby,1
|
||||
3001,3001,300,Ayumu,1
|
||||
3002,3002,300,Kasumi,1
|
||||
3003,3003,300,Shizuku,1
|
||||
3004,3004,300,Karin,1
|
||||
3005,3005,300,Ai,1
|
||||
3006,3006,300,Kanata,1
|
||||
3007,3007,300,Setsuna,1
|
||||
3008,3008,300,Emma,1
|
||||
3009,3009,300,Rina,1
|
||||
3010,3010,300,Shioriko,1
|
||||
3011,3011,300,Mia,1
|
||||
3012,3012,300,Lanzhu,1
|
||||
3099,0,300,Yu,1
|
||||
4001,4001,400,Kanon,1
|
||||
4002,4002,400,Keke,1
|
||||
4003,4003,400,Chisato,1
|
||||
4004,4004,400,Sumire,1
|
||||
4005,4005,400,Ren,1
|
||||
4006,4006,400,Kinako,1
|
||||
4007,4007,400,Mei,1
|
||||
4008,4008,400,Shiki,1
|
||||
4009,4009,400,Natsumi,1
|
||||
4010,0,400,Margarete,223121502
|
||||
4011,0,400,Tomari,223121502
|
||||
|
7
src/router/databases/csv-en/chat_reward.csv
Normal file
7
src/router/databases/csv-en/chat_reward.csv
Normal file
@@ -0,0 +1,7 @@
|
||||
_id,_number,_type,_giveType,_value,_level,_amount,_masterReleaseLabelId
|
||||
270000001,1,3,1,16005001,1,10,1
|
||||
270000002,1,3,1,16005002,1,10,1
|
||||
270000003,1,3,1,17001001,1,10,1
|
||||
270000004,1,3,1,19100001,1,10,1
|
||||
270000005,1,3,1,20000001,1,10,1
|
||||
270000006,1,3,1,20000002,1,10,1
|
||||
|
708
src/router/databases/csv-en/chat_room.csv
Normal file
708
src/router/databases/csv-en/chat_room.csv
Normal file
@@ -0,0 +1,708 @@
|
||||
_id,_masterChatId,_roomId,_hashTag,_firstLineValue,_iconPath,_appearCharaIdList,_masterReleaseLabelId
|
||||
1001001,1001,1,Honoka (DM),Honoka: Hey hey!,profile_01001_0000,1001,1
|
||||
1001002,1001,2,Honoka (Birthday 2023),Honoka is online,profile_01001_0000,1001,123080302
|
||||
1001003,1001,3,Honoka (Birthday 2023),Honoka: HAPPY BIRTHDAY!,profile_01001_0000,1001,1
|
||||
1001004,1001,16,Honoka (New Year's 2024),Honoka: Happy New Year!,profile_01001_0000,1001,324010140
|
||||
1001005,1001,17,Honoka Valentine 2024,"Honoka: Listen, listen..!",profile_01001_0000,1001,324021434
|
||||
1001007,1001,7,Honoka (April 2023),Eri: Thanks for the Valentine's Day chocolates today!,profile_01001_0000,1001,1
|
||||
1001008,1001,8,Honoka (May 2023),Kotori: Happy Valentine's Day!,profile_01001_0000,1001,1
|
||||
1001009,1001,9,Honoka (June 2023),Umi: Thank you for the Valentine's Day chocolates today!,profile_01001_0000,1001,323061304
|
||||
1001010,1001,10,Honoka (July 2023),Honoka: Summer vacation is finally here!,profile_01001_0000,1001,323072107
|
||||
1001011,1001,11,Honoka (Summer Vacation 2023),Honoka: Hey heyyy.,profile_01001_0000,1001,323082003
|
||||
1001012,1001,12,Honoka (September 2023),"Honoka: Hey, got a minute?",profile_01001_0000,1001,323092104
|
||||
1001013,1001,13,Honoka (Halloween 2023),Honoka: Trick or treat!,profile_01001_0000,1001,323103132
|
||||
1001014,1001,14,Honoka (November 2023),Honoka: Hey there.,profile_01001_0000,1001,323111603
|
||||
1001015,1001,15,Honoka (Christmas 2023),Honoka: Merry Christmas!,profile_01001_0000,1001,323122413
|
||||
1001018,1001,18,Honoka (White Day 2024),Honoka: Today's White Day!,profile_01001_0000,1001,324031435
|
||||
1002001,1002,1,Eli (DM),Eli is online,profile_01002_0000,1002,1
|
||||
1002002,1002,2,Eli (Birthday 2023),Eli is online,profile_01002_0000,1002,123102102
|
||||
1002003,1002,3,Eli (Birthday 2023),Eli: Happy birthday!,profile_01002_0000,1002,1
|
||||
1002004,1002,16,Eli: (New Year's 2024),Eli: Happy New Year,profile_01002_0000,1002,324010141
|
||||
1002005,1002,17,Eri Valentine 2024,Eri: Thanks for the Valentine's Day chocolates today!,profile_01002_0000,1002,324021435
|
||||
1002007,1002,7,Kotori Valentine 2024,Eli is online,profile_01002_0000,1002,1
|
||||
1002008,1002,8,Umi Valentine 2024,"Eli: Oh, listen to this!",profile_01002_0000,1002,1
|
||||
1002009,1002,9,Rin Valentine 2024,Eli is online,profile_01002_0000,1002,323060804
|
||||
1002010,1002,10,Maki Valentine2 024,Eli: It's been really hot lately—are you feeling okay?,profile_01002_0000,1002,323072405
|
||||
1002011,1002,11,Eli (Summer Vacation 2023),Eli: Why does everyone love scary stories in the summertime...,profile_01002_0000,1002,323080703
|
||||
1002012,1002,12,Eli (September 2023),Eli: So I went to that place selling seasonal cakes with Nozomi and Nico.,profile_01002_0000,1002,323092503
|
||||
1002013,1002,13,Eli (Halloween 2023),Eli is online,profile_01002_0000,1002,323103133
|
||||
1002014,1002,14,Eli (November 2023),Eli: It's feeling like autumn!,profile_01002_0000,1002,323112003
|
||||
1002015,1002,15,Eli (Christmas 2023),Eli is online,profile_01002_0000,1002,323122414
|
||||
1002018,1002,18,Eli (White Day 2024),Eli: Thanks for the White Day gift today.,profile_01002_0000,1002,324031436
|
||||
1003001,1003,1,Kotori (DM),Kotori: Hey! It's Kotori.,profile_01003_0000,1003,1
|
||||
1003002,1003,2,Kotori (Birthday 2023),Kotori is online,profile_01003_0000,1003,123091202
|
||||
1003003,1003,3,Kotori (Birthday 2023),Kotori sent a sticker,profile_01003_0000,1003,1
|
||||
1003004,1003,16,Kotori (New Year's 2024),Kotori: Happy New Year,profile_01003_0000,1003,324010142
|
||||
1003005,1003,17,Kotori Valentine 2024,Kotori: Happy Valentine's Day!,profile_01003_0000,1003,324021436
|
||||
1003007,1003,7,Kotori (April 2023),Kotori is online,profile_01003_0000,1003,1
|
||||
1003008,1003,8,Kotori (May 2023),Kotori sent a sticker,profile_01003_0000,1003,1
|
||||
1003009,1003,9,Kotori (June 2023),Kotori: So I got a letter from somebody who came to the last live show.,profile_01003_0000,1003,323060403
|
||||
1003010,1003,10,Kotori (July 2023),"Kotori: Hey, got a minute? There's something I want to ask you about.",profile_01003_0000,1003,323071203
|
||||
1003011,1003,11,Kotori (Summer Vacation 2023),Kotori sent a sticker,profile_01003_0000,1003,323080704
|
||||
1003012,1003,12,Kotori (September 2023),Kotori is online,profile_01003_0000,1003,323092804
|
||||
1003013,1003,13,Kotori (Halloween 2023),Kotori: Hi!,profile_01003_0000,1003,323103134
|
||||
1003014,1003,14,Kotori (November 2023),Kotori sent a sticker,profile_01003_0000,1003,323112603
|
||||
1003015,1003,15,Kotori (Christmas 2023),Kotori: Merry Christmas!,profile_01003_0000,1003,323122526
|
||||
1003018,1003,18,Kotori (White Day 2024),Kotori: Thanks for the White Day gift today!,profile_01003_0000,1003,324031437
|
||||
1004001,1004,1,Umi (DM),Umi is online,profile_01004_0000,1004,1
|
||||
1004003,1004,3,Umi (Birthday 2023),Umi: I apologize for sending this so late.,profile_01004_0000,1004,1
|
||||
1004004,1004,16,Umi (New Year's 2024),Umi: Happy New Year to you,profile_01004_0000,1004,324010143
|
||||
1004005,1004,17,Umi Valentine 2024,Umi: Thank you for the Valentine's Day chocolates today!,profile_01004_0000,1004,324021437
|
||||
1004007,1004,7,Umi (April 2023),Umi: Things are finally feeling like spring.,profile_01004_0000,1004,1
|
||||
1004008,1004,8,Umi (May 2023),Umi sent an image,profile_01004_0000,1004,1
|
||||
1004009,1004,9,Umi (June 2023),Umi is online,profile_01004_0000,1004,323061602
|
||||
1004010,1004,10,Umi (July 2023),Umi: Hello.,profile_01004_0000,1004,323072406
|
||||
1004011,1004,11,Umi (Summer Vacation 2023),"Umi: Oh dear, I have distressing news!",profile_01004_0000,1004,323082403
|
||||
1004012,1004,12,Umi (September 2023),Umi: Hello.,profile_01004_0000,1004,323090303
|
||||
1004013,1004,13,Umi (Halloween 2023),Umi is online,profile_01004_0000,1004,323103135
|
||||
1004014,1004,14,Umi (November 2023),Umi: Are you ready for our next BBQ?,profile_01004_0000,1004,323111604
|
||||
1004015,1004,15,Umi (Christmas 2023),Umi is online,profile_01004_0000,1004,323122415
|
||||
1004018,1004,18,Umi (White Day 2024),Umi: Thank you for the White Day gift today.,profile_01004_0000,1004,324031438
|
||||
1004019,1004,19,海未 お誕生日2024,Umi is online,profile_01004_0000,1004,124031502
|
||||
1005001,1005,1,Rin (DM),Rin is online,profile_01005_0000,1005,1
|
||||
1005002,1005,2,Rin (Birthday 2023),Rin is online,profile_01005_0000,1005,123110103
|
||||
1005003,1005,3,Rin (Birthday 2023),Rin sent a sticker,profile_01005_0000,1005,1
|
||||
1005004,1005,16,Rin (New Year's 2024),Rin: Happy New Year!,profile_01005_0000,1005,324010144
|
||||
1005005,1005,17,Rin Valentine 2024,Rin: The chocolate you gave me is so delicious!,profile_01005_0000,1005,324021438
|
||||
1005007,1005,7,Rin (April 2023),Rin: The days are all nice and warm now!,profile_01005_0000,1005,1
|
||||
1005008,1005,8,Rin (May 2023),Rin: G'morning!,profile_01005_0000,1005,1
|
||||
1005009,1005,9,Rin (June 2023),Rin is online,profile_01005_0000,1005,323060203
|
||||
1005010,1005,10,Rin (July 2023),"Rin: Oh, noooo!",profile_01005_0000,1005,323072303
|
||||
1005011,1005,11,Rin (Summer Vacation 2023),Rin is online,profile_01005_0000,1005,323080803
|
||||
1005012,1005,12,Rin (September 2023),Rin: I read the paper!,profile_01005_0000,1005,323092805
|
||||
1005013,1005,13,Rin (Halloween 2023),Rin: Happy Halloween!,profile_01005_0000,1005,323103136
|
||||
1005014,1005,14,Rin (November 2023),Rin: I'm excited for our next BBQ!,profile_01005_0000,1005,323112203
|
||||
1005015,1005,15,Rin (Christmas 2023),Rin: Merry Christmas!,profile_01005_0000,1005,323122416
|
||||
1005018,1005,18,Rin (White Day 2024),"Rin: Valentine's was awesome, but White Day is awesome too!",profile_01005_0000,1005,324031439
|
||||
1006001,1006,1,Maki (DM),Maki is online,profile_01006_0000,1006,1
|
||||
1006003,1006,3,Maki (Birthday 2023),Maki: Happy birthday.,profile_01006_0000,1006,1
|
||||
1006004,1006,16,Maki (New Year's 2024),Maki: Happy New Year,profile_01006_0000,1006,324010145
|
||||
1006005,1006,17,Maki Valentine 2024,Maki: Thanks for the Valentine's Day chocolates today!,profile_01006_0000,1006,324021439
|
||||
1006007,1006,7,Maki (April 2023),Maki: I saw the prettiest row of cherry trees while I was out on a walk earlier.,profile_01006_0000,1006,1
|
||||
1006008,1006,8,Maki (May 2023),Maki: Did you see the pics I sent earlier?,profile_01006_0000,1006,1
|
||||
1006009,1006,9,Maki (June 2023),Maki: So did you listen to the song I sent you earlier?,profile_01006_0000,1006,323061803
|
||||
1006010,1006,10,Maki (July 2023),"Maki: Summer vacation is just around the corner, huh.",profile_01006_0000,1006,323071204
|
||||
1006011,1006,11,Maki (Summer Vacation 2023),"Maki: Summer vacation is almost over, huh.",profile_01006_0000,1006,323081604
|
||||
1006012,1006,12,Maki (September 2023),"Maki: Hey, got a minute? I want to ask you something about the rehearsal I had you watch today.",profile_01006_0000,1006,323091903
|
||||
1006013,1006,13,Maki (Halloween 2023),Maki: Today is Halloween.,profile_01006_0000,1006,323103137
|
||||
1006014,1006,14,Maki (November 2023),Maki: It's getting colder these days.,profile_01006_0000,1006,323112103
|
||||
1006015,1006,15,Maki (Christmas 2023),Maki is online,profile_01006_0000,1006,323122417
|
||||
1006018,1006,18,Maki (White Day 2024),Maki: Morning.,profile_01006_0000,1006,324031440
|
||||
1007001,1007,1,Nozomi (DM),Nozomi: Evening.,profile_01007_0000,1007,1
|
||||
1007002,1007,2,Nozomi (Birthday 2023),Nozomi is online,profile_01007_0000,1007,123060902
|
||||
1007003,1007,3,Nozomi (Birthday 2023),Nozomi: You awake?,profile_01007_0000,1007,1
|
||||
1007004,1007,16,Nozomi (New Year's 2024),Nozomi: Happy New Year!,profile_01007_0000,1007,324010146
|
||||
1007005,1007,17,Nozomi Valentine 2024,Rarity: I have a problem!,profile_01007_0000,1007,324021440
|
||||
1007007,1007,7,Nozomi (April 2023),Nozomi sent an image,profile_01007_0000,1007,1
|
||||
1007008,1007,8,Nozomi (May 2023),Nozomi: 'Morninnng.,profile_01007_0000,1007,1
|
||||
1007009,1007,9,Nozomi (June 2023),Nozomi is online,profile_01007_0000,1007,323061403
|
||||
1007010,1007,10,Nozomi (July 2023),Nozomi: Hellooo.,profile_01007_0000,1007,323072603
|
||||
1007011,1007,11,Nozomi (Summer Vacation 2023),Nozomi: Good morning!,profile_01007_0000,1007,323081703
|
||||
1007012,1007,12,Nozomi (September 2023),Nozomi: What'cha been up to?,profile_01007_0000,1007,323092105
|
||||
1007013,1007,13,Nozomi (Halloween 2023),Nozomi: Happy Halloween!,profile_01007_0000,1007,323103138
|
||||
1007014,1007,14,Nozomi (November 2023),Nozomi is online,profile_01007_0000,1007,323111803
|
||||
1007015,1007,15,Nozomi (Christmas 2023),Nozomi: Merry Christmas!<br>How are you spending your Christmas Eve?,profile_01007_0000,1007,323122418
|
||||
1007018,1007,18,Nozomi (White Day 2024),Nozomi: Hey!,profile_01007_0000,1007,324031441
|
||||
1008001,1008,1,Hanayo (DM),Hanayo is online,profile_01008_0000,1008,1
|
||||
1008002,1008,2,Hanayo Birthday 2024,Hanayo is online,profile_01008_0000,1008,124011702
|
||||
1008003,1008,3,Hanayo (Birthday 2023),Hanayo sent a sticker,profile_01008_0000,1008,1
|
||||
1008004,1008,16,Hanayo (New Year's 2024),Hanayo: Happy New Year!,profile_01008_0000,1008,324010147
|
||||
1008005,1008,17,Hanayo Valentine 2024,Hanayo: Thanks for the Valentine's Day chocolates today!,profile_01008_0000,1008,324021441
|
||||
1008007,1008,7,Hanayo (April 2023),Hanayo: I've got big news to share!,profile_01008_0000,1008,1
|
||||
1008008,1008,8,Hanayo (May 2023),Hanayo: That was amazing...,profile_01008_0000,1008,1
|
||||
1008009,1008,9,Hanayo (June 2023),Hanayo is online,profile_01008_0000,1008,323060703
|
||||
1008010,1008,10,Hanayo (July 2023),Hanayo: It's so darn hot...,profile_01008_0000,1008,323072902
|
||||
1008011,1008,11,Hanayo (Summer Vacation 2023),Hanayo: Hello.,profile_01008_0000,1008,323080804
|
||||
1008012,1008,12,Hanayo (September 2023),"Hanayo: Hey, listen to this!",profile_01008_0000,1008,323092903
|
||||
1008013,1008,13,Hanayo (Halloween 2023),Hanayo: Happy Halloween!,profile_01008_0000,1008,323103139
|
||||
1008014,1008,14,Hanayo (November 2023),Hanayo: It's autumn harvest time!,profile_01008_0000,1008,323110803
|
||||
1008015,1008,15,Hanayo (Christmas 2023),Hanayo: Merry Christmas!,profile_01008_0000,1008,323122419
|
||||
1008018,1008,18,Hanayo (White Day 2024),Hanayo: Good morning!,profile_01008_0000,1008,324031442
|
||||
1009001,1009,1,Nico (DM),Nico: Nico-Nico-Ni! Thanks for coming to interview us today!,profile_01009_0000,1009,1
|
||||
1009002,1009,2,Nico (Birthday 2023),Nico is online,profile_01009_0000,1009,123072202
|
||||
1009003,1009,3,Nico (Birthday 2023),"Nico: Hey, are you busy today?",profile_01009_0000,1009,1
|
||||
1009004,1009,16,Nico (New Year's 2024),Nico: Happy New Year!,profile_01009_0000,1009,324010148
|
||||
1009005,1009,17,Niko Valentine 2024,Nico is online,profile_01009_0000,1009,324021442
|
||||
1009007,1009,7,Nico (April 2023),Nico: Everything going good?,profile_01009_0000,1009,1
|
||||
1009008,1009,8,Nico (May 2023),Nico: Big trouble!!!,profile_01009_0000,1009,1
|
||||
1009009,1009,9,Nico (June 2023),Nico is online,profile_01009_0000,1009,323061003
|
||||
1009010,1009,10,Nico (July 2023),"Nico: It's scorching hot, but are you staying cool?",profile_01009_0000,1009,323072604
|
||||
1009011,1009,11,Nico (Summer Vacation 2023),Nico: What are you up to?,profile_01009_0000,1009,323082904
|
||||
1009012,1009,12,Nico (September 2023),Nico is online,profile_01009_0000,1009,323090603
|
||||
1009013,1009,13,Nico (Halloween 2023),Nico: Thanks for today!,profile_01009_0000,1009,323103140
|
||||
1009014,1009,14,Nico (November 2023),Nico: Getting ready for the next BBQ?,profile_01009_0000,1009,323110603
|
||||
1009015,1009,15,Nico (Christmas 2023),Nico: Merry Christmas!,profile_01009_0000,1009,323122420
|
||||
1009018,1009,18,Nico (White Day 2024),Nico: The White Day gift was super good.,profile_01009_0000,1009,324031443
|
||||
1101001,1101,1,µ's,Honoka: Did everyone get added to the group?,profile_01001_0000,"1001,1007,1002,1003,1004,1005,1006,1008,1009",1
|
||||
1101002,1101,2,µ's (Spring 2023),Honoka: I'm sooo sleepy!<br>I can't keep my eyes open!,profile_01001_0000,"1001,1004,1007,1009,1003,1002,1006,1008,1005",1
|
||||
1101003,1101,3,Nozomi (Birthday Party 2023): Part 1,,,"1001,1003,1004,1005,1006,1008,1009",123060902
|
||||
1101004,1101,4,Nozomi (Birthday Party 2023): Part 2,,,"1001,1002,1003,1004,1005,1006,1007,1008,1009",123060902
|
||||
1101005,1101,5,µ's (Event Prep 2023),"Hanayo: Ooh, our event is just around the corner. I can't wait!",profile_01001_0000,"1008,1005,1003,1002,1007,1001,1004,1006,1009",323062206
|
||||
1101006,1101,6,Nico (Birthday Party 2023): Part 1,,,"1002,1001,1003,1004,1005,1007,1006,1008",123072202
|
||||
1101007,1101,7,Nico (Birthday Party 2023): Part 2,,,"1001,1007,1005,1006,1004,1003,1002,1008,1009",123072202
|
||||
1101008,1101,8,µ's (Summer 2023),Nico: It's soooooooooooo hot... Was summer always this hot?,profile_01001_0000,"1009,1007,1006,1001,1004,1002,1003,1008,1005",323072606
|
||||
1101009,1101,9,Honoka (Birthday Party 2023): Part 1,,,"1009,1002,1007,1008,1005,1006,1004,1003",123080302
|
||||
1101010,1101,10,Honoka (Birthday Party 2023): Part 2,,,"1007,1002,1009,1001,1008,1005,1006,1003,1004",123080302
|
||||
1101011,1101,11,μ's (August 25th),Honoka: Good! Morninnng! You all up?,profile_01001_0000,"1001,1003,1005,1007,1002,1008,1006,1004,1009",323082502
|
||||
1101012,1101,12,Kotori (Birthday Party 2023): Part 1,"Hanayo: It's almost Kotori's birthday, huh.",profile_01001_0000,"1008,1007,1004,1001,1009,1006,1002,1005",123091202
|
||||
1101013,1101,13,Kotori (Birthday Party 2023): Part 2,Kotori: You guys!,profile_01001_0000,"1003,1001,1002,1008,1009,1005,1004,1007,1006",123091202
|
||||
1101014,1101,14,µ's (Fall 2023),Umi: The hot summer melted away just in time for fall.,profile_01001_0000,"1004,1006,1003,1001,1007,1002,1005,1008,1009",323100703
|
||||
1101015,1101,15,μ's Half Anniversary,,,"1001,1009,1003,1007,1002,1005,1008,1004,1006",323101503
|
||||
1101016,1101,16,Eli (Birthday Party 2023): Part 1,,,"1006,1002,1009",123102102
|
||||
1101017,1101,17,Eli (Birthday Party 2023): Part 2,,,"1004,1005,1001,1002,1008,1009,1006,1007,1003",123102102
|
||||
1101018,1101,18,Rin (Birthday Party 2023): Part 1,,,"1006,1008,1003,1009,1001,1004,1007,1002",123110103
|
||||
1101019,1101,19,Rin (Birthday Party 2023): Part 2,,,"1005,1008,1003,1001,1007,1004,1009,1006,1002",123110103
|
||||
1101020,1101,20,Hanayo Birthday Celebration 2024①,,,"1005,1006",124011702
|
||||
1101021,1101,21,Hanayo Birthday Celebration 2024②,,,"1008,1005,1006",124011702
|
||||
1101022,1101,22,μ's winter 2024,Rin: I'm home~!,profile_01001_0000,"1005,1008,1009,1002,1007,1001,1006,1003,1004",324020906
|
||||
1101023,1101,23,µ's (Event 1 2024),,,"1001,1003,1005,1008,1006,1009,1002,1004,1007",324022202
|
||||
1101024,1101,24,Umi(Birthday Party 2024)①,,,"1001,1003",124031502
|
||||
1101025,1101,25,Umi(Birthday Party 2024)②,,,"1003,1004,1001",124031502
|
||||
1101026,1101,26,Maki(Birthday Party 2024)①,,,"1005,1006,1008",324031601
|
||||
1101027,1101,27,Maki(Birthday Party 2024)②,,,"1005,1003,1001,1002,1007,1004,1009,1006,1008",324031601
|
||||
1101028,1101,28,µ's (Event 2 2024),,,"1004,1001,1003,1005,1007,1002,1006,1009,1008",324032902
|
||||
2001001,2001,1,Chika (DM),Chika: Good evening!,profile_02001_0000,2001,1
|
||||
2001002,2001,2,Chika (Birthday 2023),Chika is online,profile_02001_0000,2001,123080104
|
||||
2001003,2001,3,Chika (Birthday 2023),Chika sent a sticker,profile_02001_0000,2001,1
|
||||
2001004,2001,16,Chika (New Year's 2024),Chika: Happy New Year!,profile_02001_0000,2001,324010149
|
||||
2001005,2001,17,Chika Valentine 2024,Chika: Happy Valentine's Day!,profile_02001_0000,2001,324021443
|
||||
2001007,2001,7,Chika (April 2023),Chika: Goood morning!,profile_02001_0000,2001,1
|
||||
2001008,2001,8,Chika (May 2023),"Chika: Agh, you'll never believe this!",profile_02001_0000,2001,1
|
||||
2001009,2001,9,Chika (June 2023),Chika is online,profile_02001_0000,2001,323060603
|
||||
2001010,2001,10,Chika (July 2023),Chika: What's up?,profile_02001_0000,2001,323072108
|
||||
2001011,2001,11,Chika (Summer Vacation 2023),Chika: Are you finished with the summer homework yet?!,profile_02001_0000,2001,323081605
|
||||
2001012,2001,12,Chika (September 2023),Chika sent a sticker,profile_02001_0000,2001,323090112
|
||||
2001013,2001,13,Chika (Halloween 2023),Chika: Happy Halloween!,profile_02001_0000,2001,323103141
|
||||
2001014,2001,14,Chika (November 2023),Chika: What's up?,profile_02001_0000,2001,323112104
|
||||
2001015,2001,15,Chika (Christmas 2023),Chika is online,profile_02001_0000,2001,323122421
|
||||
2001018,2001,18,Chika (White Day 2024),Chika: Thanks for the White Day gift today!,profile_02001_0000,2001,324031444
|
||||
2002001,2002,1,Riko (DM),Riko: Good evening.,profile_02002_0000,2002,1
|
||||
2002002,2002,2,Riko (Birthday 2023),Riko is online,profile_02002_0000,2002,123091902
|
||||
2002003,2002,3,Riko (Birthday 2023),Riko: Are you awake?,profile_02002_0000,2002,1
|
||||
2002004,2002,16,Riko (New Year's 2024),Riko: Happy New Year ♪,profile_02002_0000,2002,324010150
|
||||
2002005,2002,17,Riko Valentine 2024,Riko: Thanks for the chocolate today!,profile_02002_0000,2002,324021444
|
||||
2002007,2002,7,Riko (April 2023),Riko is online,profile_02002_0000,2002,1
|
||||
2002008,2002,8,Riko (May 2023),Riko: Good evening.,profile_02002_0000,2002,1
|
||||
2002009,2002,9,Riko (June 2023),Riko is online,profile_02002_0000,2002,323060504
|
||||
2002010,2002,10,Riko (July 2023),Riko: Hello there!,profile_02002_0000,2002,323071302
|
||||
2002011,2002,11,Riko (Summer Vacation 2023),Riko is online,profile_02002_0000,2002,323080103
|
||||
2002012,2002,12,Riko (September 2023),Riko is online,profile_02002_0000,2002,323092904
|
||||
2002013,2002,13,Riko (Halloween 2023),Riko: Do you know what October 31st is?,profile_02002_0000,2002,323103142
|
||||
2002014,2002,14,Riko (November 2023),Riko: It's getting colder lately. Are you staying warm?,profile_02002_0000,2002,323111804
|
||||
2002015,2002,15,Riko (Christmas 2023) ♪,Riko: Merry Christmas ♪,profile_02002_0000,2002,323122422
|
||||
2002018,2002,18,Riko (White Day 2024),Riko: Thanks for the White Day gift today.,profile_02002_0000,2002,324031445
|
||||
2003001,2003,1,Kanan (DM),Kanan: Evening!,profile_02003_0000,2003,1
|
||||
2003002,2003,17,Kanan (Birthday 2024),Kanan is online,profile_02003_0000,2003,124021002
|
||||
2003003,2003,3,Kanan (Birthday 2023),Kanan: Happy birthday!,profile_02003_0000,2003,1
|
||||
2003004,2003,16,Kanan (New Year's 2024),Kanan: Happy New Year!,profile_02003_0000,2003,324010151
|
||||
2003005,2003,18,Kanan Valentine 2024,Kanan: Happy Valentine's Day!,profile_02003_0000,2003,324021445
|
||||
2003007,2003,7,Kanan (April 2023),Kanan: Morning!,profile_02003_0000,2003,1
|
||||
2003008,2003,8,Kanan (May 2023),Kanan: Hey heyyy.,profile_02003_0000,2003,1
|
||||
2003009,2003,9,Kanan (June 2023),Kanan is online,profile_02003_0000,2003,323061305
|
||||
2003010,2003,10,Kanan (July 2023),Kanan: This summer heat never goes away...,profile_02003_0000,2003,323072407
|
||||
2003011,2003,11,Kanan (Summer Vacation 2023),Kanan: Hey heyyy.,profile_02003_0000,2003,323081403
|
||||
2003012,2003,12,Kanan (September 2023),"Kanan: Aw man, summer vacation is over already.",profile_02003_0000,2003,323091904
|
||||
2003013,2003,13,Kanan (Halloween 2023),Kanan: Trick or treat!,profile_02003_0000,2003,323103143
|
||||
2003014,2003,14,Kanan (November 2023),Kanan is online,profile_02003_0000,2003,323112803
|
||||
2003015,2003,15,Kanan (Christmas 2023),Kanan: Merry Christmas!,profile_02003_0000,2003,323122527
|
||||
2003019,2003,19,Kanan (White Day 2024),Kanan: Thanks for the gift today.,profile_02003_0000,2003,324031446
|
||||
2004001,2004,1,Dia (DM),Dia: Thank you for covering the Aqours performance today.,profile_02004_0000,2004,1
|
||||
2004002,2004,2,Dia (Birthday 2024),Dia is online,profile_02004_0000,2004,124010103
|
||||
2004003,2004,3,Dia (Birthday 2023),Dia: Apologies for the late message.,profile_02004_0000,2004,1
|
||||
2004004,2004,16,Dia (New Year's 2024),Dia is online,profile_02004_0000,2004,324010152
|
||||
2004005,2004,17,Daiya Valentine 2024,Dia is online,profile_02004_0000,2004,324021446
|
||||
2004007,2004,7,Dia (April 2023),Dia is online,profile_02004_0000,2004,1
|
||||
2004008,2004,8,Dia (May 2023),Dia: Hello.,profile_02004_0000,2004,1
|
||||
2004009,2004,9,Dia (June 2023),Dia is online,profile_02004_0000,2004,323062203
|
||||
2004010,2004,10,Dia (July 2023),Dia is online,profile_02004_0000,2004,323072109
|
||||
2004011,2004,11,Dia (Summer Vacation 2023),Dia is online,profile_02004_0000,2004,323082105
|
||||
2004012,2004,12,Dia (September 2023),Dia: Do you have a minute?,profile_02004_0000,2004,323091403
|
||||
2004013,2004,13,Dia (Halloween 2023),Dia: Thank you very much for everything today.,profile_02004_0000,2004,323103144
|
||||
2004014,2004,14,Dia (November 2023),Dia is online,profile_02004_0000,2004,323111003
|
||||
2004015,2004,15,Dia (Christmas 2023),Dia is online,profile_02004_0000,2004,323122528
|
||||
2004018,2004,18,Dia (White Day 2024),Dia: Thank you very much for returning the favor from Valentine's...,profile_02004_0000,2004,324031447
|
||||
2005001,2005,1,You (DM),You sent a sticker,profile_02005_0000,2005,1
|
||||
2005003,2005,3,You (Birthday 2023),You sent a sticker,profile_02005_0000,2005,1
|
||||
2005004,2005,16,You (New Year's 2024),You: Happy New Year!,profile_02005_0000,2005,324010153
|
||||
2005005,2005,17,Yo Valentine 2024,Yo: thanks for the Valentine's Day chocolates today!,profile_02005_0000,2005,324021447
|
||||
2005007,2005,7,You (April 2023),You is online,profile_02005_0000,2005,1
|
||||
2005008,2005,8,You (May 2023),You sent a sticker,profile_02005_0000,2005,1
|
||||
2005009,2005,9,You (June 2023),You is online,profile_02005_0000,2005,323061804
|
||||
2005010,2005,10,You (July 2023),You is online,profile_02005_0000,2005,323072110
|
||||
2005011,2005,11,You (Summer Vacation 2023),You: So hot...day after day...,profile_02005_0000,2005,323082905
|
||||
2005012,2005,12,You (September 2023),You sent a sticker,profile_02005_0000,2005,323091203
|
||||
2005013,2005,13,You (Halloween 2023),You: Happy Halloween!,profile_02005_0000,2005,323103145
|
||||
2005014,2005,14,You (November 2023),You: Have a sec to chat?,profile_02005_0000,2005,323112703
|
||||
2005015,2005,15,You (Christmas 2023),You is online,profile_02005_0000,2005,323122423
|
||||
2005018,2005,18,You (White Day 2024),You: Thanks for the White Day gift!,profile_02005_0000,2005,324031448
|
||||
2006001,2006,1,Yoshiko (DM),Yoshiko: Thanks for coming to check us out today.,profile_02006_0000,2006,1
|
||||
2006002,2006,2,Yoshiko (Birthday 2023),,,2006,123071302
|
||||
2006003,2006,3,Yoshiko (Birthday 2023),Yoshiko: (TEMP) User's birthday Yoshiko,profile_02006_0000,2006,1
|
||||
2006004,2006,16,Yoshiko (New Year's 2024),Yoshiko: Genesis comes to us again this year.,profile_02006_0000,2006,324010154
|
||||
2006005,2006,17,Yoshiko Valentine 2024,Yoshiko is online,profile_02006_0000,2006,324021448
|
||||
2006007,2006,7,Yoshiko (April 2023),Yoshiko is online,profile_02006_0000,2006,1
|
||||
2006008,2006,8,Yoshiko (May 2023),Yoshiko sent a sticker,profile_02006_0000,2006,1
|
||||
2006009,2006,9,Yoshiko (June 2023),Yoshiko is online,profile_02006_0000,2006,323062003
|
||||
2006010,2006,10,Yoshiko (July 2023),"Yoshiko: Hey, can I ask you a question?",profile_02006_0000,2006,323070703
|
||||
2006011,2006,11,Yoshiko (Summer Vacation 2023),Yoshiko sent a sticker,profile_02006_0000,2006,323081903
|
||||
2006012,2006,12,Yoshiko (September 2023),Yoshiko is online,profile_02006_0000,2006,323092504
|
||||
2006013,2006,13,Yoshiko (Halloween 2023),Yoshiko is online,profile_02006_0000,2006,323103146
|
||||
2006014,2006,14,Yoshiko (November 2023),Yoshiko is online,profile_02006_0000,2006,323112404
|
||||
2006015,2006,15,Yoshiko (Christmas 2023),Yoshiko sent a sticker,profile_02006_0000,2006,323122529
|
||||
2006018,2006,18,Yoshiko (White Day 2024),Yoshiko sent a sticker,profile_02006_0000,2006,324031449
|
||||
2007001,2007,1,Hanamaru (DM),Hamanaru: Good evening.,profile_02007_0000,2007,1
|
||||
2007003,2007,3,Hanamaru (Birthday 2023),Hanamaru: (TEMP) User's birthday Hanamaru,profile_02007_0000,2007,1
|
||||
2007004,2007,16,Hanamaru (New Year's 2024),Hanamaru: Happy New Year!,profile_02007_0000,2007,324010155
|
||||
2007005,2007,17,Hanamaru Valentine 2024,Hanamaru: Happy Valentine's Day!,profile_02007_0000,2007,324021449
|
||||
2007007,2007,7,Hanamaru (April 2023),Hanamaru is online,profile_02007_0000,2007,1
|
||||
2007008,2007,8,Hanamaru (May 2023),Hanamaru: Did you go somewhere for Golden Week?,profile_02007_0000,2007,1
|
||||
2007009,2007,9,Hanamaru (June 2023),Hanamaru: I read the paper!,profile_02007_0000,2007,323060204
|
||||
2007010,2007,10,Hanamaru (July 2023),Hanamaru: Thanks for bringing me the ice cream!,profile_02007_0000,2007,323071003
|
||||
2007011,2007,11,Hanamaru (Summer Vacation 2023),"Hanamaru: It's almost time for the festival, huh.",profile_02007_0000,2007,323081704
|
||||
2007012,2007,12,Hanamaru (September 2023),Hanamaru: Are you free tomorrow?,profile_02007_0000,2007,323092806
|
||||
2007013,2007,13,Hanamaru (Halloween 2023),Hanamaru: Trick or treat!,profile_02007_0000,2007,323103147
|
||||
2007014,2007,14,Hanamaru (November 2023),Hanamaru: The Kunikida sweet potato shop is open for business!,profile_02007_0000,2007,323111203
|
||||
2007015,2007,15,Hanamaru (Christmas 2023),Hanamaru: Merry Christmas!,profile_02007_0000,2007,323122530
|
||||
2007018,2007,18,Hanamaru (Birthday 2024),Hanamaru is online,profile_02007_0000,2007,124030402
|
||||
2007019,2007,19,Hanamaru (White Day 2024),Hanamaru: Thanks for the White Day gift today.,profile_02007_0000,2007,324031450
|
||||
2008001,2008,1,Mari (DM),Mari: Ciao!,profile_02008_0000,2008,1
|
||||
2008002,2008,2,Mari (Birthday 2023),Mari: (TEMP) Mari's Birthday,profile_02008_0000,2008,123061302
|
||||
2008003,2008,3,Mari (Birthday 2023),Mari: (TEMP) User's birthday Mari,profile_02008_0000,2008,1
|
||||
2008004,2008,16,Mari (New Year's 2024),Mari: Happy NEW YEAR!,profile_02008_0000,2008,324010156
|
||||
2008005,2008,17,Mari Valentine 2024,Mari: Ciao ♡♡♡!,profile_02008_0000,2008,324021450
|
||||
2008007,2008,7,Mari (April 2023),Mari is online,profile_02008_0000,2008,1
|
||||
2008008,2008,8,Mari (May 2023),Mari sent an image,profile_02008_0000,2008,1
|
||||
2008009,2008,9,Mari (June 2023),Mari: Ciao!,profile_02008_0000,2008,323062004
|
||||
2008010,2008,10,Mari (July 2023),Mari: Ciao♡,profile_02008_0000,2008,323070704
|
||||
2008011,2008,11,Mari (Summer Vacation 2023),"Mari: Camp was so much fun, huh!",profile_02008_0000,2008,323081003
|
||||
2008012,2008,12,Mari (September 2023),Mari sent an image,profile_02008_0000,2008,323092106
|
||||
2008013,2008,13,Mari (Halloween 2023),Mari is online,profile_02008_0000,2008,323103148
|
||||
2008014,2008,14,Mari (November 2023),Mari is online,profile_02008_0000,2008,323111204
|
||||
2008015,2008,15,Mari (Christmas 2023),Mari: Merry Christmas ♡,profile_02008_0000,2008,323122424
|
||||
2008018,2008,18,Mari (White Day 2024),Mari: Thanks for the White Day gift today!,profile_02008_0000,2008,324031451
|
||||
2009001,2009,1,Ruby (DM),Ruby is online,profile_02009_0000,2009,1
|
||||
2009002,2009,2,Ruby (Birthday 2023),Ruby is online,profile_02009_0000,2009,123092102
|
||||
2009003,2009,3,Ruby (Birthday 2023),Ruby: (TEMP) User's birthday Ruby,profile_02009_0000,2009,1
|
||||
2009004,2009,16,Ruby (New Year's 2024),Ruby: Happy New Year!,profile_02009_0000,2009,324010157
|
||||
2009005,2009,17,Ruby Valentine 2024,Ruby: Happy Valentine's Day!,profile_02009_0000,2009,324021451
|
||||
2009007,2009,7,Ruby (April 2023),Ruby: I went out and tried that cake you suggested!,profile_02009_0000,2009,1
|
||||
2009008,2009,8,Ruby (May 2023),Ruby: Did you go somewhere for Golden Week?,profile_02009_0000,2009,1
|
||||
2009009,2009,9,Ruby (June 2023),Ruby is online,profile_02009_0000,2009,323061404
|
||||
2009010,2009,10,Ruby (July 2023),"Ruby: Hey, can I ask you something?",profile_02009_0000,2009,323070303
|
||||
2009011,2009,11,Ruby (Summer Vacation 2023),Ruby: The summer festival is tomorrow!,profile_02009_0000,2009,323081904
|
||||
2009012,2009,12,Ruby (September 2023),Ruby sent an image,profile_02009_0000,2009,323092403
|
||||
2009013,2009,13,Ruby (Halloween 2023),Ruby: Happy Halloween! ♡,profile_02009_0000,2009,323103149
|
||||
2009014,2009,14,Ruby (November 2023),Ruby: Those sweet potatoes were tasty!,profile_02009_0000,2009,323110604
|
||||
2009015,2009,15,Ruby (Christmas 2023),Ruby: What should I do?,profile_02009_0000,2009,323122531
|
||||
2009018,2009,18,Ruby (White Day 2024),Ruby sent a sticker,profile_02009_0000,2009,324031452
|
||||
2101001,2101,1,Aqours,Chika: This is Chika!,profile_02001_0000,"2001,2005,2002,2006,2007,2004,2009,2008,2003",1
|
||||
2101002,2101,2,Mari (Birthday Party 2023): Part 1,,,"2003,2004,2008",123061302
|
||||
2101003,2101,3,Mari (Birthday Party 2023): Part 2,,,"2003,2004,2008",123061302
|
||||
2101004,2101,4,Aqours (Event Prep 2023),Chika: The event's getting closer! Sooo excited!,profile_02001_0000,"2001,2002,2005,2003,2008,2006,2007,2009,2004",323062007
|
||||
2101005,2101,5,Yoshiko (Birthday Party 2023): Part 1,,,"2001,2006,2002,2004,2005,2008,2003,2007,2009",123071302
|
||||
2101006,2101,6,Yoshiko (Birthday Party 2023): Part 2,,,"2001,2005,2006,2003,2007,2002,2008,2009,2004",123071302
|
||||
2101007,2101,7,Chika (Birthday Party 2023): Part 1,,,"2002,2005",123080104
|
||||
2101008,2101,8,Chika (Birthday Party 2023): Part 2,,,"2001,2005,2006,2008,2007,2009,2003,2002,2004",123080104
|
||||
2101009,2101,9,Aqours (Summer 2023),"Hanamaru: I'm sick of somen noodles, zura.",profile_02001_0000,"2007,2001,2009,2008,2004,2006,2002,2005,2003",323081108
|
||||
2101010,2101,10,Riko (Birthday Party 2023): Part 1,,,"2005,2002",123091902
|
||||
2101011,2101,11,Riko (Birthday Party 2023): Part 2,,,"2002,2001,2005,2003,2008,2004,2006,2007,2009",123091902
|
||||
2101012,2101,12,Aqours (Fall 2023),Kanan: Do you guys like satsuma-imo?,profile_02001_0000,"2003,2009,2006,2008,2001,2002,2005,2004,2007",323091906
|
||||
2101013,2101,13,Ruby (Birthday Party 2023): Part 1,,,"2007,2006,2009",123092102
|
||||
2101014,2101,14,Ruby (Birthday Party 2023): Part 2,,,"2009,2006,2007",123092102
|
||||
2101015,2101,15,"Aqours (October 7, 2023)","Chika: Hey hey, did everyone watch the dance video I sent? Any thoughts?",profile_02001_0000,"2001,2006,2007,2003,2004,2008,2009,2002,2005",323100704
|
||||
2101016,2101,16,Aqours Half Anniversary,,,"2001,2005,2002,2008,2003,2007,2006,2009,2004",323101504
|
||||
2101017,2101,17,Aqours (Winter 2023),Dia: How is everyone doing?,profile_02001_0000,"2004,2001,2005,2003,2008,2006,2007,2009,2002",323122307
|
||||
2101018,2101,18,Dia (Birthday Party 2024) Part 1,,,"2008,2003,2004",124010103
|
||||
2101019,2101,19,Dia (Birthday Party 2024) Part 2,,,"2001,2005,2002,2007,2006,2008,2003,2009,2004",124010103
|
||||
2101020,2101,20,Kanan (Birthday Party 2024): Part 1,,,"2008,2004",124021002
|
||||
2101021,2101,21,Kanan (Birthday Party 2024): Part 2,,,"2003,2008,2004",124021002
|
||||
2101022,2101,22,Hanamaru (Birthday Party 2024) Part 1,,,"2009,2006",124030402
|
||||
2101023,2101,23,Hanamaru (Birthday Party 2024) Part 2,,,"2007,2009,2006,2001,2005,2008,2002,2003,2004",124030402
|
||||
2101024,2101,24,event 2024,,,"2007,2006,2008,2009,2003,2004,2001,2005,2002",324030802
|
||||
2101025,2101,25,You (Birthday Party 2024) Part 1,,,"2001,2005",324031602
|
||||
2101026,2101,26,You (Birthday Party 2024) Part 2,,,"2002,2008,2003,2009,2001,2006,2007,2004,2005",324031602
|
||||
2101027,2101,27,Aqours (Spring 2024),,,"2002,2005,2003,2004,2006,2001,2008,2009,2007",324032302
|
||||
3001001,3001,1,Ayumu (DM),Ayumu is online,profile_03001_0000,3001,1
|
||||
3001003,3001,3,Ayumu (Birthday 2023),Ayumu: Good evening!,profile_03001_0000,3001,1
|
||||
3001004,3001,16,Ayumu (New Year's 2024),Ayumu: Happy New Year!,profile_03001_0000,3001,324010158
|
||||
3001005,3001,17,Valentine 2024,Ayumu: Happy Valentine's Day!,profile_03001_0000,3001,324021452
|
||||
3001007,3001,7,Ayumu (April 2023),Ayumu is online,profile_03001_0000,3001,1
|
||||
3001008,3001,8,Ayumu (May 2023),Ayumu is online,profile_03001_0000,3001,1
|
||||
3001009,3001,9,Ayumu (June 2023),Ayumu sent a sticker,profile_03001_0000,3001,323062403
|
||||
3001010,3001,10,Ayumu (July 2023),Ayumu is online,profile_03001_0000,3001,323072804
|
||||
3001011,3001,11,Ayumu (Summer Vacation 2023),Ayumu is online,profile_03001_0000,3001,323081803
|
||||
3001012,3001,12,Ayumu (September 2023),Ayumu: Hey-hey!,profile_03001_0000,3001,323090803
|
||||
3001013,3001,13,Ayumu (Halloween 2023),Ayumu: I made some Halloween sweets today!,profile_03001_0000,3001,323103150
|
||||
3001014,3001,14,Ayumu (November 2023),Ayumu: Good evening!,profile_03001_0000,3001,323113003
|
||||
3001015,3001,15,Ayumu (Christmas 2023),Ayumu: Merry Christmas!,profile_03001_0000,3001,323122532
|
||||
3001018,3001,18,Ayumu (Birthday 2024),Ayumu is online,profile_03001_0000,3001,124030103
|
||||
3001019,3001,19,Ayumu (White Day 2024),Ayumu is online,profile_03001_0000,3001,324031453
|
||||
3002001,3002,1,Kasumi (DM),Kasumi: Kasumi Nakasu here! Thanks a bunch for the interview!,profile_03002_0000,3002,1
|
||||
3002002,3002,2,Kasumi Birthday 2024,Kasumi is online,profile_03002_0000,3002,124012302
|
||||
3002003,3002,3,Kasumi (Birthday 2023),Kasumi: Today is YOUR day!<br>Happy birthday to you!,profile_03002_0000,3002,1
|
||||
3002004,3002,16,Kasumi (New Year's 2024),Kasumi: Happy New Year!,profile_03002_0000,3002,324010159
|
||||
3002005,3002,17,Kasumi Valentine 2024,Kasumi: Kasumin quiz!,profile_03002_0000,3002,324021453
|
||||
3002007,3002,7,Kasumi (April 2023),Kasumi: Gonna be nice out today!,profile_03002_0000,3002,1
|
||||
3002008,3002,8,Kasumi (May 2023),Kasumi: Newsiiie!,profile_03002_0000,3002,1
|
||||
3002009,3002,9,Kasumi (June 2023),Kasumi is online,profile_03002_0000,3002,323062603
|
||||
3002010,3002,10,Kasumi (July 2023),Kasumi: Newsiiie!,profile_03002_0000,3002,323072702
|
||||
3002011,3002,11,Kasumi (Summer Vacation 2023),Kasumi: Newsie! Thanks for those pictures of us at the water park!,profile_03002_0000,3002,323081404
|
||||
3002012,3002,12,Kasumi (September 2023),"Kasumi: Summer vacation is over, and I'm sad.",profile_03002_0000,3002,323090304
|
||||
3002013,3002,13,Kasumi (Halloween 2023),Kasumi: Happy Halloween!!!,profile_03002_0000,3002,323103151
|
||||
3002014,3002,14,Kasumi (November 2023),Kasumi: Heyyyyyy!,profile_03002_0000,3002,323112004
|
||||
3002015,3002,15,Kasumi (Christmas 2023),Kasumi: Merry Christmas!,profile_03002_0000,3002,323122533
|
||||
3002018,3002,18,Kasumi (White Day 2024),Kasumi: Newsieee!,profile_03002_0000,3002,324031454
|
||||
3003001,3003,1,Shizuku (DM),Shizuku: Hello.,profile_03003_0000,3003,1
|
||||
3003003,3003,3,Shizuku (Birthday 2023),Shizuku: I'd like to wish you a happy birthday.,profile_03003_0000,3003,1
|
||||
3003004,3003,16,Shizuku (New Year's 2024),Shizuku: Happy New Year to you!,profile_03003_0000,3003,324010160
|
||||
3003005,3003,17,Shizuku Valentine 2024,"Shizuku: Today is the day you're coming to Nijigasaki High School for an interview, right?",profile_03003_0000,3003,324021454
|
||||
3003007,3003,7,Shizuku (April 2023),Shizuku is online,profile_03003_0000,3003,1
|
||||
3003008,3003,8,Shizuku (May 2023),Shizuku is online,profile_03003_0000,3003,1
|
||||
3003009,3003,9,Shizuku (June 2023),Shizuku is online,profile_03003_0000,3003,323062404
|
||||
3003010,3003,10,Shizuku (July 2023),Shizuku is online,profile_03003_0000,3003,323072805
|
||||
3003011,3003,11,Shizuku (Summer Vacation 2023),Shizuku: Take a look at this!,profile_03003_0000,3003,323082603
|
||||
3003012,3003,12,Shizuku (September 2023),Shizuku is online,profile_03003_0000,3003,323090604
|
||||
3003013,3003,13,Shizuku (Halloween 2023),Shizuku: Happy Halloween!,profile_03003_0000,3003,323103152
|
||||
3003014,3003,14,Shizuku (November 2023),Shizuku is online,profile_03003_0000,3003,323111004
|
||||
3003015,3003,15,Shizuku (Christmas 2023),Shizuku: Merry Christmas!,profile_03003_0000,3003,323122534
|
||||
3003018,3003,18,Shizuku (White Day 2024),Shizuku: Thank you so much for inviting me today!,profile_03003_0000,3003,324031455
|
||||
3004001,3004,1,Karin (DM),Karin is online,profile_03004_0000,3004,1
|
||||
3004002,3004,2,Karin (Birthday 2023),Karin is online,profile_03004_0000,3004,123062902
|
||||
3004003,3004,3,Karin (Birthday 2023),Karin: Happy birthday!,profile_03004_0000,3004,1
|
||||
3004004,3004,16,Karin (New Year's 2024),Karin: Happy New Year,profile_03004_0000,3004,324010161
|
||||
3004005,3004,17,Karin Valentine 2024,Karin: Happy Valentine's Day!,profile_03004_0000,3004,324021455
|
||||
3004007,3004,7,Karin (April 2023),Karin is online,profile_03004_0000,3004,1
|
||||
3004008,3004,8,Karin (May 2023),Karin is online,profile_03004_0000,3004,1
|
||||
3004009,3004,9,Karin (June 2023),Karin is online,profile_03004_0000,3004,323060505
|
||||
3004010,3004,10,Karin (July 2023),Karin is online,profile_03004_0000,3004,323072806
|
||||
3004011,3004,11,Karin (Summer Vacation 2023),Karin is online,profile_03004_0000,3004,323082906
|
||||
3004012,3004,12,Karin (September 2023),Karin is online,profile_03004_0000,3004,323090113
|
||||
3004013,3004,13,Karin (Halloween 2023),Karin: Happy Halloween!,profile_03004_0000,3004,323103153
|
||||
3004014,3004,14,Karin (November 2023),Karin is online,profile_03004_0000,3004,323113004
|
||||
3004015,3004,15,Karin (Christmas 2023),Karin is online,profile_03004_0000,3004,323122535
|
||||
3004018,3004,18,Karin (White Day 2024),Karin is online,profile_03004_0000,3004,324031456
|
||||
3005001,3005,1,Ai (DM),Ai: Yoo-hoo! Ai Miyashita here!,profile_03005_0000,3005,1
|
||||
3005002,3005,2,Ai (Birthday 2023),Ai is online,profile_03005_0000,3005,123053002
|
||||
3005003,3005,3,Ai (Birthday 2023),Ai sent a sticker,profile_03005_0000,3005,1
|
||||
3005004,3005,16,Ai (New Year's 2024),"Ai: Hey, Happy New Year!",profile_03005_0000,3005,324010162
|
||||
3005005,3005,17,Ai Valentine 2024,Ai: Happy Valentine's Day!,profile_03005_0000,3005,324021456
|
||||
3005007,3005,7,Ai (April 2023),Ai is online,profile_03005_0000,3005,1
|
||||
3005008,3005,8,Ai (May 2023),Ai: FINALLY! The big break is here!,profile_03005_0000,3005,1
|
||||
3005009,3005,9,Ai (June 2023),Ai: I bought the most adorable umbrella!,profile_03005_0000,3005,323060902
|
||||
3005010,3005,10,Ai (July 2023),Ai: Summer! Yay!!!,profile_03005_0000,3005,323072009
|
||||
3005011,3005,11,Ai (Summer Vacation 2023),"Ai: Hey, are you like, completely fine with haunted houses and stuff?",profile_03005_0000,3005,323081004
|
||||
3005012,3005,12,Ai (September 2023),Ai is online,profile_03005_0000,3005,323090114
|
||||
3005013,3005,13,Ai (Halloween 2023),Ai: Happy Halloween!!!,profile_03005_0000,3005,323103154
|
||||
3005014,3005,14,Ai (November 2023),Ai: Want to come see me practice?,profile_03005_0000,3005,323112204
|
||||
3005015,3005,15,Ai (Christmas 2023),Ai: Merry Xmas!,profile_03005_0000,3005,323122536
|
||||
3005018,3005,18,Ai (White Day 2024),Ai is online,profile_03005_0000,3005,324031457
|
||||
3006001,3006,1,Kanata (DM),Kanata is online,profile_03006_0000,3006,1
|
||||
3006002,3006,2,Kanata: (Birthday 2023),Kanata is online,profile_03006_0000,3006,123121602
|
||||
3006003,3006,3,Kanata (Birthday 2023),Kanata: Haaappy birthdaaay!,profile_03006_0000,3006,1
|
||||
3006004,3006,16,Kanata (New Year's 2024),Kanata: Happy New Year!,profile_03006_0000,3006,324010163
|
||||
3006005,3006,17,Kanata Valentine 2024,Kanata: Today is Valentine's Day!,profile_03006_0000,3006,324021457
|
||||
3006007,3006,7,Kanata (April 2023),Kanata is online,profile_03006_0000,3006,1
|
||||
3006008,3006,8,Kanata (May 2023),Kanata is online,profile_03006_0000,3006,1
|
||||
3006009,3006,9,Kanata (June 2023),Kanata is online,profile_03006_0000,3006,323061103
|
||||
3006010,3006,10,Kanata (July 2023),"Kanata: So hey,",profile_03006_0000,3006,323072111
|
||||
3006011,3006,11,Kanata (Summer Vacation 2023),Kanata: 'cuse me! Question!,profile_03006_0000,3006,323082604
|
||||
3006012,3006,12,Kanata (September 2023),Kanata is online,profile_03006_0000,3006,323091503
|
||||
3006013,3006,13,Kanata (Halloween 2023),Kanata: Sleeepy Halloweeen!,profile_03006_0000,3006,323103155
|
||||
3006014,3006,14,Kanata (November 2023),Kanata: It's perfect weather!,profile_03006_0000,3006,323112804
|
||||
3006015,3006,15,Kanata (Christmas 2023),Kanata: Merry Xmas!,profile_03006_0000,3006,323122537
|
||||
3006018,3006,18,Kanata (White Day 2024),Kanata is online,profile_03006_0000,3006,324031458
|
||||
3007001,3007,1,Setsuna (DM),Setsuna is online,profile_03007_0000,3007,1
|
||||
3007002,3007,2,Setsuna (Birthday 2023),Setsuna is online,profile_03007_0000,3007,123080802
|
||||
3007003,3007,3,Setsuna (Birthday 2023),Setsuna: A very happy birthday to you!,profile_03007_0000,3007,1
|
||||
3007004,3007,16,Setsuna (New Year's 2024),Setsuna: Hello and a Happy New Year to you!,profile_03007_0000,3007,324010164
|
||||
3007005,3007,17,Setsuna Valentine 2024,Setsuna: Hello!,profile_03007_0000,3007,324021458
|
||||
3007007,3007,7,Setsuna (April 2023),"Setsuna: It was so chilly not that long ago, but it's really warmed up now.",profile_03007_0000,3007,1
|
||||
3007008,3007,8,Setsuna (May 2023),Setsuna is online,profile_03007_0000,3007,1
|
||||
3007009,3007,9,Setsuna (June 2023),Setsuna is online,profile_03007_0000,3007,323062703
|
||||
3007010,3007,10,Setsuna (July 2023),Setsuna: Good morning!,profile_03007_0000,3007,323072304
|
||||
3007011,3007,11,Setsuna (Summer Vacation 2023),Setsuna: It's hot again today.,profile_03007_0000,3007,323081804
|
||||
3007012,3007,12,Setsuna (September 2023),Setsuna: It sure is hot for September.,profile_03007_0000,3007,323091703
|
||||
3007013,3007,13,Setsuna (Halloween 2023),Setsuna: Happy Halloween!,profile_03007_0000,3007,323103156
|
||||
3007014,3007,14,Setsuna (November 2023),Setsuna: It's getting real chilly lately.,profile_03007_0000,3007,323110804
|
||||
3007015,3007,15,Setsuna (Christmas 2023),Setsuna: Merry Christmas!,profile_03007_0000,3007,323122538
|
||||
3007018,3007,18,Setsuna (White Day 2024),Setsuna is online,profile_03007_0000,3007,324031459
|
||||
3008001,3008,1,Emma (DM),Emma is online,profile_03008_0000,3008,1
|
||||
3008002,3008,17,Ema Birthday 2024,Emma is online,profile_03008_0000,3008,124020502
|
||||
3008003,3008,3,Emma (Birthday 2023),Emma: Happy birthday!,profile_03008_0000,3008,1
|
||||
3008004,3008,16,Emma (New Year's 2024),Emma: Happy New Year!,profile_03008_0000,3008,324010165
|
||||
3008005,3008,18,Ema Valentine 2024,"Emma: Hey, hey",profile_03008_0000,3008,324021459
|
||||
3008007,3008,7,Emma (April 2023),Emma: The weather's nice and warm now!,profile_03008_0000,3008,1
|
||||
3008008,3008,8,Emma (May 2023),Emma is online,profile_03008_0000,3008,1
|
||||
3008009,3008,9,Emma (June 2023),Emma is online,profile_03008_0000,3008,323061306
|
||||
3008010,3008,10,Emma (July 2023),"Emma: It's summer vacation, after all!!",profile_03008_0000,3008,323072010
|
||||
3008011,3008,11,Emma (Summer Vacation 2023),Emma: A discovery for the ages!,profile_03008_0000,3008,323081104
|
||||
3008012,3008,12,Emma (September 2023),"Emma: Aw, man. The hurricane's here.",profile_03008_0000,3008,323092404
|
||||
3008013,3008,13,Emma (Halloween 2023),Emma: Happy Halloween!!,profile_03008_0000,3008,323103157
|
||||
3008014,3008,14,Emma (November 2023),Emma: It's time for a sweet potato party!,profile_03008_0000,3008,323112604
|
||||
3008015,3008,15,Emma (Christmas 2023),Emma: Merry Christmas!!!,profile_03008_0000,3008,323122539
|
||||
3008019,3008,19,Emma (White Day 2024),Emma is online,profile_03008_0000,3008,324031460
|
||||
3009001,3009,1,Rina (DM),Rina is online,profile_03009_0000,3009,1
|
||||
3009002,3009,2,Rina: (Birthday 2023),Rina is online,profile_03009_0000,3009,123111302
|
||||
3009003,3009,3,Rina (Birthday 2023),Rina: Happy birthday to you!,profile_03009_0000,3009,1
|
||||
3009004,3009,16,Rina (New Year's 2024),Rina: Happy New Year,profile_03009_0000,3009,324010166
|
||||
3009005,3009,17,Rina Valentine 2024,Rina: Today is Valentine's Day!,profile_03009_0000,3009,324021460
|
||||
3009007,3009,7,Rina (April 2023),Rina: It's so nice and warm out now.,profile_03009_0000,3009,1
|
||||
3009008,3009,8,Rina (May 2023),Rina: Are you busy during Golden Week?,profile_03009_0000,3009,1
|
||||
3009009,3009,9,Rina (June 2023),Rina is online,profile_03009_0000,3009,323060805
|
||||
3009010,3009,10,Rina (July 2023),Rina is online,profile_03009_0000,3009,323072011
|
||||
3009011,3009,11,Rina (Summer Vacation 2023),Rina: We're all at the beach.,profile_03009_0000,3009,323081105
|
||||
3009012,3009,12,Rina (September 2023),Rina: Wanna go out during our autumn break?,profile_03009_0000,3009,323091504
|
||||
3009013,3009,13,Rina (Halloween 2023),Rina is online,profile_03009_0000,3009,323103158
|
||||
3009014,3009,14,Rina (November 2023),Rina is online,profile_03009_0000,3009,323112704
|
||||
3009015,3009,15,Rina (Christmas 2023),Rina: Merry Christmas!,profile_03009_0000,3009,323122540
|
||||
3009018,3009,18,Rina (White Day 2024),Rina is online,profile_03009_0000,3009,324031461
|
||||
3010001,3010,1,Shioriko (DM),Shioriko: Thank you very much for coming...,profile_03010_0000,3010,1
|
||||
3010002,3010,2,Shioriko (Birthday 2023),Shioriko is online,profile_03010_0000,3010,123100502
|
||||
3010003,3010,3,Shioriko (Birthday 2023),(TEMP) Shioriko birthday message to player,profile_03010_0000,3010,1
|
||||
3010004,3010,16,Shioriko (New Year's 2024),Shioriko: Happy New Year to you,profile_03010_0000,3010,324010167
|
||||
3010005,3010,17,Shioriko Valentine 2024,Shioriko: Hello!,profile_03010_0000,3010,324021461
|
||||
3010007,3010,7,Shioriki (April 2023),Shioriko: (TEMP) Shioriko April event chat,profile_03010_0000,3010,1
|
||||
3010008,3010,8,Shioriko (May 2023),Shioriko: (TEMP) Shioriko May event chat,profile_03010_0000,3010,1
|
||||
3010009,3010,9,Shioriko (June 2023),Shioriko: (TEMP) Shioriko June event chat,profile_03010_0000,3010,323060404
|
||||
3010010,3010,10,Shioriko (July 2023),Shioriko: (TEMP) Shioriko July event chat,profile_03010_0000,3010,323072408
|
||||
3010011,3010,11,Shioriko (Summer Vacation 2023),Shioriko: (TEMP) Shioriko August event chat,profile_03010_0000,3010,323081606
|
||||
3010012,3010,12,Shioriko (September 2023),Shioriko is online,profile_03010_0000,3010,323090804
|
||||
3010013,3010,13,Shioriko (Halloween 2023),Shioriko is online,profile_03010_0000,3010,323103159
|
||||
3010014,3010,14,Shioriko (November 2023),Shioriko: Could I get your opinion on something?,profile_03010_0000,3010,323111503
|
||||
3010015,3010,15,Shioriko (Christmas 2023),Shioriko: Merry Christmas!,profile_03010_0000,3010,323122541
|
||||
3010018,3010,18,Shioriko (White Day 2024),Shioriko: Thank you so much for the gift!,profile_03010_0000,3010,324031462
|
||||
3011001,3011,1,Mia (DM),"Mia: Hey, thanks for coming to our show.",profile_03011_0000,3011,1
|
||||
3011002,3011,2,Mia (Birthday 2023),Mia is online,profile_03011_0000,3011,123120602
|
||||
3011003,3011,3,Mia (Birthday 2023),(TEMP) Mia birthday message to player,profile_03011_0000,3011,1
|
||||
3011004,3011,16,Mia (New Year's 2024),Mia is online,profile_03011_0000,3011,324010168
|
||||
3011005,3011,17,Mia Valentine 2024,Mia: I'm giving you a gift today,profile_03011_0000,3011,324021462
|
||||
3011007,3011,7,Mia (April 2023),Mia: (TEMP) Mia April event chat,profile_03011_0000,3011,1
|
||||
3011008,3011,8,Mia (May 2023),Mia: (TEMP) Mia May event chat,profile_03011_0000,3011,1
|
||||
3011009,3011,9,Mia (June 2023),Mia: (TEMP) Mia June event chat,profile_03011_0000,3011,323062704
|
||||
3011010,3011,10,Mia (July 2023),Mia: (TEMP) Mia July event chat,profile_03011_0000,3011,323070304
|
||||
3011011,3011,11,Mia (Summer Vacation 2023),Mia: (TEMP) Mia August event chat,profile_03011_0000,3011,323080603
|
||||
3011012,3011,12,Mia (September 2023),Mia is online,profile_03011_0000,3011,323091204
|
||||
3011013,3011,13,Mia (Halloween 2023),Mia: Happy Halloween!!,profile_03011_0000,3011,323103160
|
||||
3011014,3011,14,Mia (November 2023),Mia: I went to look at the fall colors!,profile_03011_0000,3011,323112405
|
||||
3011015,3011,15,Mia (Christmas 2023),Mia is online,profile_03011_0000,3011,323122542
|
||||
3011018,3011,18,Mia (White Day 2024),Mia: Hi.,profile_03011_0000,3011,324031463
|
||||
3012001,3012,1,Lanzhu (DM),Lanzhu: It's Lanzhu!,profile_03012_0000,3012,1
|
||||
3012002,3012,18,Lanzhu (Birthday 2024),Lanzhu is online,profile_03012_0000,3012,124021502
|
||||
3012003,3012,3,Lanzhu (Birthday 2023),(TEMP) Lanzhu birthday message to player,profile_03012_0000,3012,1
|
||||
3012004,3012,16,Lanzhu (New Year's 2024),Lanzhu: Xin Nian Kuai Le!,profile_03012_0000,3012,324010169
|
||||
3012005,3012,17,Lanzhu (Valentine's 2024),Lanzhu: Today is Valentine's Day.,profile_03012_0000,3012,324021463
|
||||
3012007,3012,7,Lanzhu (April 2023),Lanzhu: (TEMP) Lanzhu April event chat,profile_03012_0000,3012,1
|
||||
3012008,3012,8,Lanzhu (May 2023),Lanzhu: (TEMP) Lanzhu May event chat,profile_03012_0000,3012,1
|
||||
3012009,3012,9,Lanzhu (June 2023),Lanzhu: (TEMP) Lanzhu June event chat,profile_03012_0000,3012,323060704
|
||||
3012010,3012,10,Lanzhu (July 2023),Lanzhu: (TEMP) Lanzhu July event chat,profile_03012_0000,3012,323072112
|
||||
3012011,3012,11,Lanzhu (Summer Vacation 2023),Lanzhu: (TEMP) Lanzhu August event chat,profile_03012_0000,3012,323082004
|
||||
3012012,3012,12,Lanzhu (September 2023),Lanzhu: (TEMP) Lanzhu September event chat,profile_03012_0000,3012,323090115
|
||||
3012013,3012,13,Lanzhu (Halloween 2023),Lanzhu: 万圣节快乐!!,profile_03012_0000,3012,323103161
|
||||
3012014,3012,14,Lanzhu (November 2023),Lanzhu is online,profile_03012_0000,3012,323112406
|
||||
3012015,3012,15,Lanzhu (Christmas 2023),Lanzhu: Shengdan Jie Kuai Le!,profile_03012_0000,3012,323122543
|
||||
3012019,3012,19,Lanzhu (White Day 2024),Lanzhu is online,profile_03012_0000,3012,324031464
|
||||
3099001,3099,1,Yu (Summer Festival 2023),,,3099,323082802
|
||||
3099002,3099,2,Yu (Joint Festival 2023),,,3099,323120802
|
||||
3101001,3101,1,Nijigasaki,Lanzhu: Ni hao!<br>Hi everyone!,profile_03001_0000,"3001,3002,3006,3005,3007,3009,3012,3010,3011,3008,3004,3003,3099",1
|
||||
3101002,3101,2,Nijigasaki (Spring 2023),Ai: Ay yi yi!,profile_03001_0000,"3005,3099,3003,3002,3008,3006,3001,3007,3012,3010,3011,3009,3004",1
|
||||
3101003,3101,3,Ai (Birthday Party 2023): Part 1,,,"3001,3004,3009,3010,3099",123053002
|
||||
3101004,3101,4,Ai (Birthday Party 2023): Part 2,,,"3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3099",123053002
|
||||
3101005,3101,5,Nijigasaki (Event Prep 2023),,,"3003,3005,3001,3007,3010,3012,3011,3009,3099,3002,3006,3008,3004",323061806
|
||||
3101006,3101,6,Karin (Birthday Party 2023): Part 1,,,"3004,3008,3011,3012",123062902
|
||||
3101007,3101,7,Karin (Birthday Party 2023): Part 2,,,"3001,3002,3003,3004,3005,3006,3007,3008,3009,3010,3011,3012,3099",123062902
|
||||
3101008,3101,8,Nijigasaki (Summer 2023),,,"3012,3099,3010,3006,3001,3002,3003,3009,3008,3011,3007,3004,3005",323071304
|
||||
3101009,3101,9,Setsuna (Birthday Party 2023): Part 1,,,"3002,3099,3005,3008,3006,3012,3003,3009,3001,3010,3011,3004",123080802
|
||||
3101010,3101,10,Setsuna (Birthday Party 2023): Part 2,,,"3007,3002,3008,3005,3099,3012,3011,3001,3009,3006,3010,3004,3003",123080802
|
||||
3101011,3101,11,Nijigasaki (Summer Festival 2023),,,"3099,3012,3002,3006,3008,3009,3001",323082606
|
||||
3101012,3101,12,Nijigasaki (Fall 2023),Shioriko: Would you like to start a book club with me?,profile_03001_0000,"3010,3004,3008,3003,3002,3006,3009,3011,3012,3099,3001,3005,3007",323091206
|
||||
3101013,3101,13,Shioriko (Birthday Party 2023): Part 1,,,"3099,3002,3009,3005,3012,3008,3007,3010,3006,3004,3003,3011,3001",123100502
|
||||
3101014,3101,14,Shioriko (Birthday Party 2023): Part 2,,,"3005,3006,3012,3010,3002,3001,3011,3004,3007,3008,3003,3009,3099",123100502
|
||||
3101015,3101,15,Nijigasaki Half Anniversary,,,"3099,3005,3004,3007,3010,3009,3011,3002,3012,3003,3008,3001,3006",323101403
|
||||
3101016,3101,16,Rina (Birthday Party 2023): Part 1,,,"3005,3011,3099,3009",123111302
|
||||
3101017,3101,17,Rina: (Birthday Party 2023): Part 2,,,"3009,3099,3005,3011",123111302
|
||||
3101018,3101,18,"Nijigasaki (November 21, 2023)","Kasumi: Hey, everyone!",profile_03001_0000,"3002,3006,3005,3099,3003,3009,3008,3011,3012,3010,3001,3004,3007",323112106
|
||||
3101019,3101,19,Mia (Birthday Party 2023): Part 1,,,"3009,3011,3005",123120602
|
||||
3101020,3101,20,Mia (Birthday Party 2023): Part 2,,,"3011,3005,3009",123120602
|
||||
3101021,3101,21,Kanata (Birthday Party 2023) Part 1,,,"3008,3011,3003,3012,3009,3004,3002,3007,3001,3005,3099,3010",123121602
|
||||
3101022,3101,22,Kanata (Birthday Party 2023) Part 2,,,"3006,3099,3003,3002,3001,3011,3009,3004,3005,3010,3007,3012,3008",123121602
|
||||
3101023,3101,23,Nijigasaki Love Song by Me,,,"3099,3002,3007,3006,3003,3011,3004,3012,3008,3009,3001,3010",323122202
|
||||
3101024,3101,24,Nijigasaki (Winter 2023),Lanzhu: What do you want when it gets cold?,profile_03001_0000,"3012,3006,3011,3005,3009,3007,3004,3010,3099,3001,3003,3002,3008",323122308
|
||||
3101025,3101,25,Kasumi Birthday Celebration 2024①,,,"3002,3004",124012302
|
||||
3101026,3101,26,Kasumi Birthday Celebration 2024②,,,"3002,3005,3007,3001,3003,3006,3010,3009,3011,3012,3099,3008,3004",124012302
|
||||
3101027,3101,27,Ema Birthday Celebration 2024①,,,"3008,3006",124020502
|
||||
3101028,3101,28,Ema Birthday Celebration 2024②,,,"3008,3006",124020502
|
||||
3101029,3101,29,Lanzhu (Birthday Party 2024): Part 1,,,"3012,3005,3010,3004,3009,3007,3008,3001,3003,3002,3006,3099,3011",124021502
|
||||
3101030,3101,30,Lanzhu (Birthday Party 2024): Part 2,,,"3012,3004,3007,3008,3011,3002,3003,3010,3009,3006,3001,3005,3099",124021502
|
||||
3101031,3101,31,Ayumu (Birthday Party 2024): Part 1,,,"3001,3010",124030103
|
||||
3101032,3101,32,Ayumu (Birthday Party 2024): Part 2,,,"3001,3010",124030103
|
||||
3101033,3101,33,Shizuku (Birthday Party 2024): Part 1,,,"3007,3003",324031603
|
||||
3101034,3101,34,Shizuku (Birthday Party 2024): Part 2,,,"3007,3099,3005,3002,3009,3012,3004,3011,3008,3001,3006,3010,3003",324031603
|
||||
4001001,4001,1,Kanon (DM),Kanon: Good morning!,profile_04001_0000,4001,1
|
||||
4001002,4001,2,Kanon (Birthday 2023),Kanon is online,profile_04001_0000,4001,1
|
||||
4001003,4001,3,Kanon (Birthday 2023),Kanon: Can we chat real quick?,profile_04001_0000,4001,1
|
||||
4001004,4001,16,Kanon (New Year's 2024),Kanon: Happy New Year!,profile_04001_0000,4001,324010170
|
||||
4001005,4001,17,Kanon Valentine 2024,Kanon: I sent you a stamp!,profile_04001_0000,4001,324021003
|
||||
4001007,4001,7,Kanon (April 2023),Kanon: Good morning!,profile_04001_0000,4001,1
|
||||
4001008,4001,8,Kanon (May 2023),Kanon: Heyo!,profile_04001_0000,4001,1
|
||||
4001009,4001,9,Kanon (June 2023),Kanon: Thanks for that special feature on Liella!,profile_04001_0000,4001,323061004
|
||||
4001010,4001,10,Kanon (July 2023),Kanon is online,profile_04001_0000,4001,323072012
|
||||
4001011,4001,11,Kanon (Summer Vacation 2023),Kanon: I'm hot...,profile_04001_0000,4001,323080104
|
||||
4001012,4001,12,Kanon (September 2023),Kanon: Heyo!,profile_04001_0000,4001,323090116
|
||||
4001013,4001,13,Kanon (Halloween 2023),Kanon: Trick or treat!,profile_04001_0000,4001,323102508
|
||||
4001014,4001,14,Kanon (November 2023),Kanon: I'm back!,profile_04001_0000,4001,323110109
|
||||
4001015,4001,15,Kanon (Christmas 2023),Kanon: Merry Christmas!,profile_04001_0000,4001,323122303
|
||||
4001018,4001,18,Kanon (White Day 2024),Kanon: Hello there!,profile_04001_0000,4001,324031004
|
||||
4002001,4002,1,Keke (DM),Keke sent a sticker,profile_04002_0000,4002,1
|
||||
4002002,4002,2,Keke (Birthday 2023),Keke is online,profile_04002_0000,4002,123071702
|
||||
4002003,4002,3,Keke (Birthday 2023),Keke sent a sticker,profile_04002_0000,4002,1
|
||||
4002004,4002,16,Keke (New Year's 2024),"Keke: Hey, Hey, Happy New Year!",profile_04002_0000,4002,324010171
|
||||
4002005,4002,17,Keke (Valentine's 2024),Keke: Happy Valentine's!,profile_04002_0000,4002,324021464
|
||||
4002007,4002,7,Keke (April 2023),Keke sent an image,profile_04002_0000,4002,1
|
||||
4002008,4002,8,Keke (May 2023),Keke: How are you this fine evening?,profile_04002_0000,4002,1
|
||||
4002009,4002,9,Keke (June 2023),Keke is online,profile_04002_0000,4002,323060102
|
||||
4002010,4002,10,Keke (July 2023),Keke: It's starting!,profile_04002_0000,4002,323072013
|
||||
4002011,4002,11,Keke (Summer Vacation 2023),Keke is online,profile_04002_0000,4002,323082404
|
||||
4002012,4002,12,Keke (September 2023),Keke sent a sticker,profile_04002_0000,4002,323091404
|
||||
4002013,4002,13,Keke (Halloween 2023),Keke: Trick or treat!,profile_04002_0000,4002,323102509
|
||||
4002014,4002,14,Keke (November 2023),Keke: How are you this fine evening?,profile_04002_0000,4002,323110110
|
||||
4002015,4002,15,Keke (Christmas 2023),Keke: Merry Christmas!,profile_04002_0000,4002,323122544
|
||||
4002018,4002,18,Keke (White Day 2024),Keke: How are you this fine evening?,profile_04002_0000,4002,324031103
|
||||
4003001,4003,1,Chisato (DM),Chisato: Heyo!,profile_04003_0000,4003,1
|
||||
4003002,4003,18,Chisato (Birthday 2024),Chisato is online,profile_04003_0000,4003,124022502
|
||||
4003003,4003,3,Chisato (Birthday 2023),Chisato: Heyo!,profile_04003_0000,4003,1
|
||||
4003004,4003,16,Chisato (New Year's 2024),Chisato: Heyooo!,profile_04003_0000,4003,324010172
|
||||
4003005,4003,17,Chisato Valentine 2024,Chisato: Heyooo!,profile_04003_0000,4003,324020903
|
||||
4003007,4003,7,Chisato (April 2023),Chisato: Morning!,profile_04003_0000,4003,1
|
||||
4003008,4003,8,Chisato (May 2023),Chisato: Heyooo!,profile_04003_0000,4003,1
|
||||
4003009,4003,9,Chisato (June 2023),Chisato is online,profile_04003_0000,4003,323061104
|
||||
4003010,4003,10,Chisato (July 2023),Chisato is online,profile_04003_0000,4003,323071804
|
||||
4003011,4003,11,Chisato (Summer Vacation 2023),Chisato is online,profile_04003_0000,4003,323081106
|
||||
4003012,4003,12,Chisato (September 2023),Chisato: Heyooo!,profile_04003_0000,4003,323090117
|
||||
4003013,4003,13,Chisato (Halloween 2023),Chisato is online,profile_04003_0000,4003,323103162
|
||||
4003014,4003,14,Chisato (November 2023),Chisato: Heyooo!,profile_04003_0000,4003,323110111
|
||||
4003015,4003,15,Chisato (Christmas 2023),Chisato: Merry Christmas!,profile_04003_0000,4003,323122545
|
||||
4003019,4003,19,Chisato (White Day 2024),Chisato: Happy White Day!,profile_04003_0000,4003,324031465
|
||||
4004001,4004,1,Sumire (DM),Sumire: Hello.,profile_04004_0000,4004,1
|
||||
4004002,4004,2,Sumire (Birthday 2023),Sumire is online,profile_04004_0000,4004,123092802
|
||||
4004003,4004,3,Sumire (Birthday 2023),Sumire: Are you still awake by any chance?,profile_04004_0000,4004,1
|
||||
4004004,4004,16,Sumire (New Year's 2024),Sumire: Happy New Year!,profile_04004_0000,4004,324010173
|
||||
4004005,4004,17,Sumire Valentine 2024,Sumire: Hello,profile_04004_0000,4004,324021465
|
||||
4004007,4004,7,Sumire (April 2023),Sumire is online,profile_04004_0000,4004,1
|
||||
4004008,4004,8,Sumire (May 2023),Sumire is online,profile_04004_0000,4004,1
|
||||
4004009,4004,9,Sumire (June 2023),"Sumire: Hey, can I ask you a question?",profile_04004_0000,4004,323062902
|
||||
4004010,4004,10,Sumire (July 2023),Sumire: Summer vacation is finally here.,profile_04004_0000,4004,323072014
|
||||
4004011,4004,11,Sumire (Summer Vacation 2023),Sumire: It's been so hot lately.,profile_04004_0000,4004,323082106
|
||||
4004012,4004,12,Sumire (September 2023),Sumire: How're you doing?,profile_04004_0000,4004,323091704
|
||||
4004013,4004,13,Sumire (Halloween 2023),Sumire is online,profile_04004_0000,4004,323102510
|
||||
4004014,4004,14,Sumire (November 2023),"Sumire: Today was really cold, huh?",profile_04004_0000,4004,323110112
|
||||
4004015,4004,15,Sumire (Christmas 2023),Sumire: Merry Christmas!,profile_04004_0000,4004,323122546
|
||||
4004018,4004,18,Sumire (White Day 2024),Sumire: Happy White Day!,profile_04004_0000,4004,324031466
|
||||
4005001,4005,1,Ren (DM),"Ren: I know it's late, so I apologize if I'm disturbing you.",profile_04005_0000,4005,1
|
||||
4005002,4005,2,Ren (Birthday 2023),Ren is online,profile_04005_0000,4005,123112402
|
||||
4005003,4005,3,Ren (Birthday 2023),Ren: Pardon the interruption.,profile_04005_0000,4005,1
|
||||
4005004,4005,16,Ren (New Year's 2024),Ren: Happy New Year,profile_04005_0000,4005,324010174
|
||||
4005005,4005,17,Ren (Valentine's 2024),Ren is online,profile_04005_0000,4005,324021466
|
||||
4005007,4005,7,Ren (April 2023),Ren: Good afternoon.,profile_04005_0000,4005,1
|
||||
4005008,4005,8,Ren (May 2023),Ren: Good evening.,profile_04005_0000,4005,1
|
||||
4005009,4005,9,Ren (June 2023),Ren: The special article on Liella! has arrived.,profile_04005_0000,4005,323062604
|
||||
4005010,4005,10,Ren (July 2023),Ren is online,profile_04005_0000,4005,323071805
|
||||
4005011,4005,11,Ren (Summer Vacation 2023),Ren is online,profile_04005_0000,4005,323080403
|
||||
4005012,4005,12,Ren (September 2023),"Ren: It's a new semester now, huh.",profile_04005_0000,4005,323090118
|
||||
4005013,4005,13,Ren (Halloween 2023),Ren is online,profile_04005_0000,4005,323102511
|
||||
4005014,4005,14,Ren (November 2023),"Ren: We're certainly in Fall now, huh?",profile_04005_0000,4005,323110113
|
||||
4005015,4005,15,Ren (Christmas 2023),Ren is online,profile_04005_0000,4005,323122547
|
||||
4005018,4005,18,Ren (White Day 2024),Ren: Good afternoon.,profile_04005_0000,4005,324031467
|
||||
4006001,4006,1,Kinako (DM),Kinako: What's up?,profile_04006_0000,4006,1
|
||||
4006003,4006,3,Kinako (Birthday 2023),"Kinako: This is outta the blue, but do you like potatoes?",profile_04006_0000,4006,1
|
||||
4006004,4006,16,Kinako (New Year's 2024),Kinako: Happy New Yearrr,profile_04006_0000,4006,324010175
|
||||
4006005,4006,17,Kinako Valentine 2024,Kinako: Can I have a minute?,profile_04006_0000,4006,324021103
|
||||
4006007,4006,7,Kinako (April 2023),Kinako: Take a look at this!,profile_04006_0000,4006,1
|
||||
4006008,4006,8,Kinako (May 2023),Kinako: Golden week's almost here.,profile_04006_0000,4006,1
|
||||
4006009,4006,9,Kinako (June 2023),"Kinako: That rain's never gonna stop, huh?",profile_04006_0000,4006,323062204
|
||||
4006010,4006,10,Kinako (July 2023),Kinako: I got newsss!,profile_04006_0000,4006,323071004
|
||||
4006011,4006,11,Kinako (Summer Vacation 2023),"Natsumi Onitsuka, a.k.a OniNatsu! An Oni-supplement for you with daily doses of this and that, etc.!",profile_04006_0000,4006,323080604
|
||||
4006012,4006,12,Kinako (September 2023),Kinako is online,profile_04006_0000,4006,323090119
|
||||
4006013,4006,13,Kinako (Halloween 2023),Kinako is online,profile_04006_0000,4006,323102512
|
||||
4006014,4006,14,Kinako (November 2023),"Kinako: Dang, it sure is Fall now!",profile_04006_0000,4006,323110114
|
||||
4006015,4006,15,Kinako (Christmas 2023),Kinako: Merry Christmas!,profile_04006_0000,4006,323122304
|
||||
4006018,4006,18,Kinako (White Day 2024),Kinako is online,profile_04006_0000,4006,324031005
|
||||
4007001,4007,1,Mei (DM),Mei: Sup?,profile_04007_0000,4007,1
|
||||
4007002,4007,2,Mei (Birthday 2023),Mei is online,profile_04007_0000,4007,123102902
|
||||
4007003,4007,3,Mei (Birthday 2023),Mei: You busy right now?,profile_04007_0000,4007,1
|
||||
4007004,4007,16,Mei (New Year's 2024),Mei: Sup?,profile_04007_0000,4007,324010176
|
||||
4007005,4007,17,Mei Valentine 2024,Mei is online,profile_04007_0000,4007,324021004
|
||||
4007007,4007,7,Mei (April 2023),Mei sent an image,profile_04007_0000,4007,1
|
||||
4007008,4007,8,Mei (May 2023),Mei: You have any plans for Golden Week yet?,profile_04007_0000,4007,1
|
||||
4007009,4007,9,Mei (June 2023),Mei: Got the news article! Thanks for always being such a big help.,profile_04007_0000,4007,323060604
|
||||
4007010,4007,10,Mei (July 2023),Mei: Sup.,profile_04007_0000,4007,323071806
|
||||
4007011,4007,11,Mei (Summer Vacation 2023),Mei: Emergency...,profile_04007_0000,4007,323082107
|
||||
4007012,4007,12,Mei (September 2023),Mei: Can you believe we're already going back to school?,profile_04007_0000,4007,323090120
|
||||
4007013,4007,13,Mei (Halloween 2023),Mei is online,profile_04007_0000,4007,323102513
|
||||
4007014,4007,14,Mei (November 2023),Mei: Could we chat for a bit?,profile_04007_0000,4007,323110115
|
||||
4007015,4007,15,Mei (Christmas 2023),Mei: Merry Christmas!,profile_04007_0000,4007,323122548
|
||||
4007018,4007,18,Mei (White Day 2024),Mei: Got a sec?,profile_04007_0000,4007,324031006
|
||||
4008001,4008,1,Shiki (DM),Shiki: Test message.,profile_04008_0000,4008,1
|
||||
4008002,4008,2,Shiki (Birthday 2023),Shiki is online,profile_04008_0000,4008,123061702
|
||||
4008003,4008,3,Shiki (Birthday 2023),Shiki: Happy birthday.,profile_04008_0000,4008,1
|
||||
4008004,4008,16,Shiki (New Year's 2024),"Shiki: Hey, Happy New Year",profile_04008_0000,4008,324010177
|
||||
4008005,4008,17,Shiki Valentine 2024,Shiki: can I come in now?,profile_04008_0000,4008,324021104
|
||||
4008007,4008,7,Shiki (April 2023),Shiki: The cherry blossoms are blooming.,profile_04008_0000,4008,1
|
||||
4008008,4008,8,Shiki (May 2023),Shiki is online,profile_04008_0000,4008,1
|
||||
4008009,4008,9,Shiki (June 2023),Shiki is online,profile_04008_0000,4008,323060806
|
||||
4008010,4008,10,Shiki (July 2023),Shiki is online,profile_04008_0000,4008,323072015
|
||||
4008011,4008,11,Shiki (Summer Vacation 2023),Shiki is online,profile_04008_0000,4008,323080404
|
||||
4008012,4008,12,Shiki (September 2023),Shiki: I got the article. Thanks.,profile_04008_0000,4008,323090121
|
||||
4008013,4008,13,Shiki (Halloween 2023),Shiki is online,profile_04008_0000,4008,323102202
|
||||
4008014,4008,14,Shiki (November 2023),Shiki: Thanks for writing that Halloween article for us.,profile_04008_0000,4008,323111504
|
||||
4008015,4008,15,Shiki (Christmas 2023),Shiki is online,profile_04008_0000,4008,323122549
|
||||
4008018,4008,18,Shiki (White Day 2024),Shiki is online,profile_04008_0000,4008,324031468
|
||||
4009001,4009,1,Natsumi (DM),Natsumi: Thanks for all the hard work!,profile_04009_0000,4009,1
|
||||
4009002,4009,2,Natsumi (Birthday 2023),Natsumi is online,profile_04009_0000,4009,123080702
|
||||
4009003,4009,3,Natsumi (Birthday 2023),Natsumi: ONINATSU!,profile_04009_0000,4009,1
|
||||
4009004,4009,16,Natsumi (New Year's 2024),Natsumi: It's a Happy New Year!,profile_04009_0000,4009,324010178
|
||||
4009005,4009,17,Natsumi Valentine 2024,"Natsumi: I know this is sudden, but I have a quiz..!",profile_04009_0000,4009,324020904
|
||||
4009007,4009,7,Natsumi (April 2023),Natsumi sent a sticker,profile_04009_0000,4009,1
|
||||
4009008,4009,8,Natsumi (May 2023),Natsumi is online,profile_04009_0000,4009,1
|
||||
4009009,4009,9,Natsumi (June 2023),"Natsumi: Thanksies for the article, honey!",profile_04009_0000,4009,323060506
|
||||
4009010,4009,10,Natsumi (July 2023),Natsumi: OniNatsuuu!,profile_04009_0000,4009,323072016
|
||||
4009011,4009,11,Natsumi (Summer Vacation 2023),Natsumi sent a sticker,profile_04009_0000,4009,323082108
|
||||
4009012,4009,12,Natsumi (September 2023),Natsumi: Surprise! OniNatsu pop quiz!,profile_04009_0000,4009,323090122
|
||||
4009013,4009,13,Natsumi (Halloween 2023),Natsumi: Happy Halloween!,profile_04009_0000,4009,323102514
|
||||
4009014,4009,14,Natsumi (November 2023),Natsumi: Fall is the perfect season for good food!,profile_04009_0000,4009,323110116
|
||||
4009015,4009,15,Natsumi (Christmas 2023),Natsumi: It's a Merry Christmas!,profile_04009_0000,4009,323122550
|
||||
4009018,4009,18,Natsumi (White Day 2024),Natsumi: OniNatsuuu!,profile_04009_0000,4009,324031104
|
||||
4010001,4010,1,Margarete (DM),,,4010,323121501
|
||||
4010003,4010,3,Margarete (Birthday 2023),,,4010,323121501
|
||||
4011001,4011,1,Tomari (DM),,,4011,323121501
|
||||
4011003,4011,3,Tomari (Birthday 2023),,,4011,323121501
|
||||
4101001,4101,1,Liella!,Keke: FIRST!,profile_04001_0000,"4002,4003,4004,4001,4005,4006,4009,4007,4008",1
|
||||
4101002,4101,2,Kanon (Birthday Party 2023): Part 1,,,"4003,4006,4002,4007,4008,4005,4004,4009",1
|
||||
4101003,4101,3,Kanon (Birthday Party 2023): Part 2,,,"4001,4003,4002,4006,4004,4005,4008,4009,4007",1
|
||||
4101004,4101,4,Shiki (Birthday Party 2023): Part 1,,,"4006,4007,4009",123061702
|
||||
4101005,4101,5,Shiki (Birthday Party 2023): Part 2,,,"4006,4007,4008,4009",123061702
|
||||
4101006,4101,6,Liella! (Event Prep 2023),"Kanon: Hey, guys, are you nearly ready?",profile_04001_0000,"4001,4002,4004,4007,4008,4003,4005,4006,4009",323062008
|
||||
4101007,4101,7,Liella! (Summer 2023),"Kinako: Tanabata is just around the corner, huh!",profile_04001_0000,"4006,4007,4002,4005,4003,4001,4004,4009,4008",323070402
|
||||
4101008,4101,8,Keke (Birthday Party 2023): Part 1,,,"4004,4001,4003,4005",123071702
|
||||
4101009,4101,9,Keke (Birthday Party 2023): Part 2,,,"4002,4001,4004,4003,4005",123071702
|
||||
4101010,4101,10,Natsumi (Birthday Party 2023): Part 1,,,"4006,4008,4007",123080702
|
||||
4101011,4101,11,Natsumi (Birthday Party 2023): Part 2,,,"4009,4006,4007,4008",123080702
|
||||
4101012,4101,12,Liella! (Summer Festival 2023),,,"4001,4003,4002,4005,4006,4004,4007,4008,4009",323082406
|
||||
4101013,4101,13,Sumire (Birthday Party 2023): Part 1,,,"4002,4001,4006,4003,4005,4009,4008,4007",123092802
|
||||
4101014,4101,14,Sumire (Birthday Party 2023): Part 2,,,"4004,4002,4005,4001,4003,4006,4007,4008,4009",123092802
|
||||
4101015,4101,15,Liella! (Fall 2023),Ren: Have you all appreciated the gorgeous moon tonight?,profile_04001_0000,"4005,4003,4002,4008,4007,4009,4004,4006,4001",323100102
|
||||
4101016,4101,16,Liella! Half Anniversary,,,"4003,4004,4007,4006,4002,4005,4009,4008,4001",323101404
|
||||
4101017,4101,17,Mei (Birthday Party 2023): Part 1,,,"4008,4007",123102902
|
||||
4101018,4101,18,Mei (Birthday Party 2023): Part 2,,,"4007,4008,4009,4006,4002,4004,4001,4003,4005",123102902
|
||||
4101019,4101,19,Ren (Birthday Party 2023): Part 1,,,"4003,4002,4004,4001",123112402
|
||||
4101020,4101,20,Ren (Birthday Party 2023): Part 2,,,"4005,4004,4002,4003,4001",123112402
|
||||
4101021,4101,21,Liella! (Winter 2023),"Ren: Hey everyone, thank you for coming to today's Christmas Party!",profile_04001_0000,"4005,4001,4006,4003,4007,4008,4009,4004,4002",323122552
|
||||
4101022,4101,22,Tomari (Birthday Party 2023) Part 1,,,"4009,4001,4004",123122802
|
||||
4101023,4101,23,Tomari (Birthday Party 2023) Part 2,,,"4004,4006,4007,4011,4009,4001,4002,4003,4005,4008,4010",123122802
|
||||
4101024,4101,24,Margarete Birthday Celebration 2024①,,,"4001,4004,4003,4005,4009,4011,4008,4007,4002,4006",124012002
|
||||
4101025,4101,25,Margarete Birthday Celebration 2024②,,,"4010,4011,4001,4003,4004,4006,4009,4002,4007,4008,4005",124012002
|
||||
4101026,4101,26,Liella! Live 2024,,,"4003,4002,4011,4010,4006,4007,4009,4008,4001,4005,4004",324011902
|
||||
4101027,4101,27,Chisato (Birthday Party 2024): Part 1,,,"4001,4002,4004,4005",124022502
|
||||
4101028,4101,28,Chisato (Birthday Party 2024): Part 2,,,"4003,4001,4002,4004,4005",124022502
|
||||
4101029,4101,29,Liella! (Spring 2024),Kanon is online,profile_04001_0000,"4002,4001,4006,4009,4004,4003,4008,4007,4005",324030303
|
||||
4101030,4101,30,Kinako (Birthday Party 2024): Part 1,,,"4009,4006",324031604
|
||||
4101031,4101,31,Kinako (Birthday Party 2024): Part 2,,,"4006,4009,4007,4008",324031604
|
||||
|
151
src/router/databases/csv-en/chat_stamp.csv
Normal file
151
src/router/databases/csv-en/chat_stamp.csv
Normal file
@@ -0,0 +1,151 @@
|
||||
_id,_name,_group,_isUsableChat,_isUsableMulti,_filename,_order,_initialStamp,_masterReleaseLabelId
|
||||
1,汗,0,1,1,stamp_00_00000_0001,10068,1,1
|
||||
2,100点,0,1,1,stamp_00_00000_0002,10069,1,1
|
||||
3,土下座する女性,0,1,1,stamp_00_00000_0003,10045,1,1
|
||||
4,OKのポーズをする女性,0,1,1,stamp_00_00000_0004,10060,1,1
|
||||
5,にこやかな笑顔,0,1,1,stamp_00_00000_0005,10001,1,1
|
||||
6,目もにこやかな笑顔,0,1,1,stamp_00_00000_0006,10047,1,1
|
||||
7,大笑いの顔,0,1,1,stamp_00_00000_0007,10011,1,1
|
||||
8,控えめな笑顔,0,1,1,stamp_00_00000_0008,10000,1,1
|
||||
9,微笑む目の笑顔 ,0,1,1,stamp_00_00000_0009,10002,1,1
|
||||
10,ハートの笑顔,0,1,1,stamp_00_00000_0010,10048,1,1
|
||||
11,にやり,0,1,1,stamp_00_00000_0011,10003,1,1
|
||||
12,ウィンクの顔,0,1,1,stamp_00_00000_0012,10012,1,1
|
||||
13,笑顔の悪魔の顔,0,1,1,stamp_00_00000_0013,10010,1,1
|
||||
14,嬉し泣きの顔,0,1,1,stamp_00_00000_0014,10008,1,1
|
||||
15,涙の笑顔,0,1,1,stamp_00_00000_0015,10025,1,1
|
||||
16,泣き顔,0,1,1,stamp_00_00000_0016,10026,1,1
|
||||
17,大声で泣いている顔,0,1,1,stamp_00_00000_0017,10027,1,1
|
||||
19,紅潮した顔,0,1,1,stamp_00_00000_0019,10018,1,1
|
||||
20,投げキスの顔,0,1,1,stamp_00_00000_0020,10019,1,1
|
||||
21,パーティの顔,0,1,1,stamp_00_00000_0021,10084,1,1
|
||||
22,恐怖で叫ぶ顔,0,1,0,stamp_00_00000_0022,10030,1,1
|
||||
23,ふくれっ面,0,1,0,stamp_00_00000_0023,10052,1,1
|
||||
24,鼻息の荒い顔,0,1,1,stamp_00_00000_0024,10031,1,1
|
||||
25,我慢する顔 ,0,1,1,stamp_00_00000_0025,10029,1,1
|
||||
26,心配そうな顔,0,1,0,stamp_00_00000_0026,10004,1,1
|
||||
27,悲しいけど安心した顔,0,1,1,stamp_00_00000_0027,10024,1,1
|
||||
28,眉があがった顔,0,1,0,stamp_00_00000_0028,10005,1,1
|
||||
29,思考中の顔,0,1,0,stamp_00_00000_0029,10028,1,1
|
||||
30,手を口に添えた顔,0,1,1,stamp_00_00000_0030,10021,1,1
|
||||
31,静かにの顔,0,1,0,stamp_00_00000_0031,10022,1,1
|
||||
32,口チャックの顔,0,1,0,stamp_00_00000_0032,10006,1,1
|
||||
33,キスの顔,0,1,1,stamp_00_00000_0033,10007,1,1
|
||||
34,舌を出した顔 ,0,1,1,stamp_00_00000_0034,10020,1,1
|
||||
35,目を細めて舌を出した顔,0,1,1,stamp_00_00000_0035,10013,1,1
|
||||
36,サングラスの笑顔,0,1,1,stamp_00_00000_0036,10014,1,1
|
||||
37,驚いた顔,0,1,1,stamp_00_00000_0037,10051,1,1
|
||||
38,美味しい顔,0,1,1,stamp_00_00000_0038,10015,1,1
|
||||
39,よだれ顔,0,1,1,stamp_00_00000_0039,10023,1,1
|
||||
40,寝てる顔,0,1,1,stamp_00_00000_0040,10016,1,1
|
||||
41,あくびの顔,0,1,1,stamp_00_00000_0041,10032,1,1
|
||||
43,くしゃみ顔,0,1,1,stamp_00_00000_0043,10083,1,1
|
||||
44,暑い顔,0,1,1,stamp_00_00000_0044,10058,1,1
|
||||
45,寒い顔,0,1,1,stamp_00_00000_0045,10059,1,1
|
||||
46,親指を上げた手,0,1,1,stamp_00_00000_0046,10062,1,1
|
||||
48,拍手,0,1,1,stamp_00_00000_0048,10066,1,1
|
||||
49,手を振る,0,1,1,stamp_00_00000_0049,10067,1,1
|
||||
50,OKの手,0,1,1,stamp_00_00000_0050,10061,1,1
|
||||
51,右を指差す手の甲,0,1,1,stamp_00_00000_0051,10063,1,1
|
||||
52,腕の筋肉,0,1,1,stamp_00_00000_0052,10064,1,1
|
||||
53,あわせた手,0,1,1,stamp_00_00000_0053,10065,1,1
|
||||
54,アルパカ,0,1,1,stamp_00_00000_0054,10070,1,1
|
||||
55,アルパカ2,0,1,1,stamp_00_00000_0055,10071,1,1
|
||||
56,アルパカ3,0,1,1,stamp_00_00000_0056,10072,1,1
|
||||
57,犬,0,1,1,stamp_00_00000_0057,10073,1,1
|
||||
58,犬2,0,1,1,stamp_00_00000_0058,10074,1,1
|
||||
59,犬3,0,1,1,stamp_00_00000_0059,10075,1,1
|
||||
60,猫,0,1,1,stamp_00_00000_0060,10076,1,1
|
||||
61,猫2,0,1,1,stamp_00_00000_0061,10077,1,1
|
||||
62,猫3,0,1,1,stamp_00_00000_0062,10078,1,1
|
||||
63,ふくろう,0,1,1,stamp_00_00000_0063,10079,1,1
|
||||
64,ふくろう2,0,1,1,stamp_00_00000_0064,10080,1,1
|
||||
65,ふくろう3,0,1,1,stamp_00_00000_0065,10081,1,1
|
||||
66,クラッカー,0,1,1,stamp_00_00000_0066,10085,1,1
|
||||
67,富士山,0,1,1,stamp_00_00000_0067,10090,1,1
|
||||
68,電球,0,1,1,stamp_00_00000_0068,10087,1,1
|
||||
69,太陽,0,1,1,stamp_00_00000_0069,10088,1,1
|
||||
70,波,0,1,1,stamp_00_00000_0070,10089,1,1
|
||||
71,サイリウム,0,1,1,stamp_00_00000_0071,10095,1,1
|
||||
72,ピアノ,0,1,1,stamp_00_00000_0072,10093,1,1
|
||||
73,海,0,1,1,stamp_00_00000_0073,10091,1,1
|
||||
74,ドレス,0,1,1,stamp_00_00000_0074,10094,1,1
|
||||
75,星空,0,1,1,stamp_00_00000_0075,10092,1,1
|
||||
76,走る,0,1,1,stamp_00_00000_0076,10082,1,1
|
||||
77,ありがとう!,0,1,1,stamp_00_00000_0077,10034,1,1
|
||||
78,ありがとう><,0,1,1,stamp_00_00000_0078,10035,1,1
|
||||
79,かわいいウインク,0,1,1,stamp_00_00000_0079,10037,1,1
|
||||
80,ごめん,0,1,1,stamp_00_00000_0080,10044,1,1
|
||||
81,爆笑,0,1,1,stamp_00_00000_0081,10039,1,1
|
||||
82,ひええ,0,1,1,stamp_00_00000_0082,10042,1,1
|
||||
83,しくしく,0,1,1,stamp_00_00000_0083,10043,1,1
|
||||
84,紅潮,0,1,1,stamp_00_00000_0084,10040,1,1
|
||||
85,頑張って!,0,1,1,stamp_00_00000_0085,10036,1,1
|
||||
86,了解,0,1,1,stamp_00_00000_0086,10009,1,1
|
||||
87,えっへん,0,1,1,stamp_00_00000_0087,10033,1,1
|
||||
88,うふふ,0,1,1,stamp_00_00000_0088,10038,1,1
|
||||
89,まかせて,0,1,1,stamp_00_00000_0089,10049,1,1
|
||||
90,苦笑,0,1,0,stamp_00_00000_0090,10050,1,1
|
||||
91,どうしたの?,0,1,0,stamp_00_00000_0091,10053,1,1
|
||||
92,どうかな?,0,1,1,stamp_00_00000_0092,10054,1,1
|
||||
93,やっほー!,0,1,1,stamp_00_00000_0093,10055,1,1
|
||||
94,手を挙げる,0,1,1,stamp_00_00000_0094,10056,1,1
|
||||
95,よろしく,0,1,1,stamp_00_00000_0095,10057,1,1
|
||||
96,プレゼント,0,1,1,stamp_00_00000_0096,10086,1,1
|
||||
11001003,穂乃果ファイト・頑張ろう,0,1,1,stamp_01_01001_0003,3,1,1
|
||||
11002005,絵里NO,0,1,1,stamp_01_01002_0005,14,0,1
|
||||
11003001,ことりおはよう,0,1,1,stamp_01_01003_0001,19,0,1
|
||||
11003010,"Kotori Take care of yourselves,Everybody",0,1,1,stamp_01_01003_0010,27,0,224011505
|
||||
11004002,海未おやすみ,0,1,1,stamp_01_01004_0002,29,0,1
|
||||
11005007,凛よろしく,0,1,1,stamp_01_01005_0007,43,0,1
|
||||
11006004,真姫OK,0,1,1,stamp_01_01006_0004,49,0,1
|
||||
11007006,希お願いします,0,1,1,stamp_01_01007_0006,60,0,1
|
||||
11007010,希なかなかやん,0,1,1,stamp_01_01007_0010,64,0,223091506
|
||||
11008009,花陽あわわ,0,1,1,stamp_01_01008_0009,72,0,1
|
||||
11009008,にこわ~い,0,1,1,stamp_01_01009_0008,80,0,1
|
||||
22001001,千歌おはよう,0,1,1,stamp_02_02001_0001,82,1,1
|
||||
22002002,梨子おやすみ,0,1,1,stamp_02_02002_0002,92,0,1
|
||||
22003006,果南お願いします,0,1,1,stamp_02_02003_0006,105,0,1
|
||||
22004003,黒澤ダイヤ 素晴らしいですわ,0,1,1,stamp_02_02004_0003,111,0,223061506
|
||||
22004005,ダイヤNO,0,1,1,stamp_02_02004_0005,113,0,1
|
||||
22005004,曜OK,0,1,1,stamp_02_02005_0004,121,0,1
|
||||
22006007,善子よろしく,0,1,1,stamp_02_02006_0007,133,0,1
|
||||
22007009,花丸あわわ,0,1,1,stamp_02_02007_0009,144,0,1
|
||||
22007010,花丸 次は頑張るずら,0,1,1,stamp_02_02007_0010,144,0,223101510
|
||||
22008008,鞠莉わ~い,0,1,1,stamp_02_02008_0008,152,0,1
|
||||
22009003,ルビィファイト・頑張ろう,0,1,1,stamp_02_02009_0003,156,0,1
|
||||
33001001,歩夢おはよう,0,1,1,stamp_03_03001_0001,163,1,1
|
||||
33001003,上原歩夢 がんばろうね!,0,1,1,stamp_03_03001_0003,165,0,223071507
|
||||
33002008,かすみわ~い,0,1,1,stamp_03_03002_0008,179,0,1
|
||||
33003003,しずくファイト・頑張ろう,0,1,1,stamp_03_03003_0003,183,0,1
|
||||
33004007,果林よろしく,0,1,1,stamp_03_03004_0007,196,0,1
|
||||
33005006,愛お願いします,0,1,1,stamp_03_03005_0006,204,0,1
|
||||
33006002,彼方おやすみ,0,1,1,stamp_03_03006_0002,209,0,1
|
||||
33007005,せつ菜NO,0,1,1,stamp_03_03007_0005,221,0,1
|
||||
33007010,Setsuna has saved the world again,0,1,1,stamp_03_03007_0010,225,0,223111506
|
||||
33008004,エマOK,0,1,1,stamp_03_03008_0004,229,0,1
|
||||
33009009,璃奈あわわ,0,1,1,stamp_03_03009_0009,243,0,1
|
||||
33010004,栞子OK,0,1,1,stamp_03_03010_0004,247,0,1
|
||||
33011007,ミアよろしく,0,1,1,stamp_03_03011_0007,259,0,1
|
||||
33012009,嵐珠あわわ,0,1,1,stamp_03_03012_0009,270,0,1
|
||||
44001002,かのんおやすみ,0,1,1,stamp_04_04001_0002,272,1,1
|
||||
44002003,可可ファイト・頑張ろう,0,1,1,stamp_04_04002_0003,282,0,1
|
||||
44002010,Keke So warm...,0,1,1,stamp_04_04002_0010,288,0,223121508
|
||||
44003004,千砂都OK,0,1,1,stamp_04_04003_0004,292,0,1
|
||||
44004008,すみれわ~い,0,1,1,stamp_04_04004_0008,305,0,1
|
||||
44005005,恋NO,0,1,1,stamp_04_04005_0005,311,0,1
|
||||
44006009,きな子あわわ,0,1,1,stamp_04_04006_0009,324,0,1
|
||||
44007006,メイお願いします,0,1,1,stamp_04_04007_0006,330,0,1
|
||||
44007010,米女メイ おつかれ,0,1,1,stamp_04_04007_0010,334,0,223081506
|
||||
44008007,四季よろしく,0,1,1,stamp_04_04008_0007,341,0,1
|
||||
44009001,夏美おはよう,0,1,1,stamp_04_04009_0001,344,0,1
|
||||
66001001,ヨハネ 行くわよ!,0,1,1,stamp_06_06001_0001,601,0,223120803
|
||||
66002001,ハナマル よろしくずら~,0,1,1,stamp_06_06002_0001,602,0,223120803
|
||||
66003001,ダイヤ すみません…,0,1,1,stamp_06_06003_0001,603,0,223120803
|
||||
66004001,ルビィ ぷるぷる…,0,1,1,stamp_06_06004_0001,604,0,223120803
|
||||
66005001,チカ 次もがんばろ!,0,1,1,stamp_06_06005_0001,605,0,223120803
|
||||
66006001,ヨウ すごい!,0,1,1,stamp_06_06006_0001,606,0,223120803
|
||||
66007001,カナン 大丈夫,0,1,1,stamp_06_06007_0001,607,0,223120803
|
||||
66008001,リコ あわわ…,0,1,1,stamp_06_06008_0001,608,0,223120803
|
||||
66009001,マリ 期待してるわ,0,1,1,stamp_06_06009_0001,609,0,223120803
|
||||
66099001,ライラプス 修行だね,0,1,1,stamp_06_06099_0001,610,0,223120803
|
||||
|
1
src/router/databases/csv-en/chat_voice_key.csv
Normal file
1
src/router/databases/csv-en/chat_voice_key.csv
Normal file
@@ -0,0 +1 @@
|
||||
_key,_num,_group,_comment,_masterReleaseLabelId
|
||||
|
10
src/router/databases/csv-en/chipster_result_code.csv
Normal file
10
src/router/databases/csv-en/chipster_result_code.csv
Normal file
@@ -0,0 +1,10 @@
|
||||
_resultCode,_masterDialogId,_stayFlag,_silentFlag,_masterReleaseLabelId
|
||||
0,ChipsterErrorCode_0,0,0,1
|
||||
100000,ChipsterErrorCode_100000,0,0,1
|
||||
100404,ChipsterErrorCode_100404,0,0,1
|
||||
100408,ChipsterErrorCode_100408,0,0,1
|
||||
100500,ChipsterErrorCode_100500,0,0,1
|
||||
200000,ChipsterErrorCode_200000,0,0,1
|
||||
200100,ChipsterErrorCode_200100,0,0,1
|
||||
200200,ChipsterErrorCode_200200,0,0,1
|
||||
999999,ChipsterErrorCode_999999,0,0,1
|
||||
|
41
src/router/databases/csv-en/comic.csv
Normal file
41
src/router/databases/csv-en/comic.csv
Normal file
@@ -0,0 +1,41 @@
|
||||
_id,_masterGroupId,_number,_name,_imageName,_masterReleaseLabelId
|
||||
100001,100,1,"""o""",comic_01_0001,1
|
||||
100002,100,2,Dark-Proof Gear,comic_01_0002,1
|
||||
100003,100,3,Work Socks,comic_01_0003,1
|
||||
100004,100,4,Combating the Jitters,comic_01_0004,1
|
||||
100005,100,5,Take Care of Your Health,comic_01_0005,1
|
||||
100006,100,6,Perm Time?,comic_01_0006,1
|
||||
100007,100,7,Secret Combo,comic_01_0007,1
|
||||
100008,100,8,Certified Rice-Grading Expert,comic_01_0008,1
|
||||
100009,100,9,A New National Holiday,comic_01_0009,1
|
||||
200001,200,1,Are You Glowing?,comic_02_0001,1
|
||||
200002,200,2,Riko's Secret,comic_02_0002,1
|
||||
200003,200,3,Kanan's Training Regimen,comic_02_0003,1
|
||||
200004,200,4,My Collection Just Keeps Growing!,comic_02_0004,1
|
||||
200005,200,5,"Short Sleeves, Even in Winter!",comic_02_0005,1
|
||||
200006,200,6,A Fallen Angel's Lunchtime,comic_02_0006,1
|
||||
200007,200,7,Enjoy This Purr-Fect Meal!,comic_02_0007,1
|
||||
200008,200,8,"That'll Be X00,000 Yen",comic_02_0008,1
|
||||
200009,200,9,Sleepy Time Merch?,comic_02_0009,1
|
||||
300001,300,1,Complimenting Everything and Anything,comic_03_0001,1
|
||||
300002,300,2,Marketing Kasumin,comic_03_0002,1
|
||||
300003,300,3,Method Acting,comic_03_0003,1
|
||||
300004,300,4,Waiting for Pickup,comic_03_0004,1
|
||||
300005,300,5,Ai's Wealth of Knowledge,comic_03_0005,1
|
||||
300006,300,6,Always Ready for a Nap,comic_03_0006,1
|
||||
300007,300,7,Apple Pie with a Side of Dark Matter,comic_03_0007,1
|
||||
300008,300,8,Law of Nature,comic_03_0008,1
|
||||
300009,300,9,Requesting Budget Revision,comic_03_0009,1
|
||||
300010,300,10,Mistakes Are Just Happy Accidents,comic_03_0010,1
|
||||
300011,300,11,Giver and Receiver,comic_03_0011,1
|
||||
300012,300,12,Lanzhu's Day Off,comic_03_0012,1
|
||||
300013,300,13,I Can't Just Choose One!,comic_03_0013,1
|
||||
400001,400,1,Two Sides of the Same Coin,comic_04_0001,1
|
||||
400002,400,2,Lucky Charm,comic_04_0002,1
|
||||
400003,400,3,Cute Is Blind,comic_04_0003,1
|
||||
400004,400,4,Is This Your Sumire?,comic_04_0004,1
|
||||
400005,400,5,Warm and Toasty,comic_04_0005,1
|
||||
400006,400,6,Sprouting Wings,comic_04_0006,1
|
||||
400007,400,7,Saved to the Cloud,comic_04_0007,1
|
||||
400008,400,8,The Seven Wonders of the Science Club,comic_04_0008,1
|
||||
400009,400,9,Another Long Day of Work...,comic_04_0009,1
|
||||
|
10
src/router/databases/csv-en/common_bg_movie.csv
Normal file
10
src/router/databases/csv-en/common_bg_movie.csv
Normal file
@@ -0,0 +1,10 @@
|
||||
_id,_masterMovieId,_bandCategory,_sceneType,_masterReleaseLabelId
|
||||
1,16100001,0,LiveSelectScene,1
|
||||
2,16100001,0,LiveSelectScene,1
|
||||
3,16100001,0,LiveSelectScene,1
|
||||
4,16100001,0,LiveSelectScene,1
|
||||
5,16100001,0,LiveSelectScene,1
|
||||
6,16100001,0,LiveSelectScene,1
|
||||
7,16100001,0,MusicSelectScene,1
|
||||
8,16100001,0,MusicSelectScene,1
|
||||
9,16100001,0,MusicSelectScene,1
|
||||
|
191
src/router/databases/csv-en/const.csv
Normal file
191
src/router/databases/csv-en/const.csv
Normal file
@@ -0,0 +1,191 @@
|
||||
_id,_value,_masterReleaseLabelId
|
||||
MIN_STAMINA,0,1
|
||||
MAX_STAMINA,300,1
|
||||
EXCESS_STAMINA,999,1
|
||||
LIMIT_STAMINA,9999,1
|
||||
STAMINA_RECOVER_VALUE,1,1
|
||||
STAMINA_RECOVER_TIME,300,1
|
||||
MIN_GEM,0,1
|
||||
MAX_GEM,9999999,1
|
||||
MIN_COIN,0,1
|
||||
MAX_COIN,999999999,1
|
||||
MIN_CARD_AMOUNT,0,1
|
||||
MAX_CARD_AMOUNT,9999999,1
|
||||
MIN_SEAL,0,1
|
||||
MAX_SEAL,9999999,1
|
||||
MIN_ITEM_AMOUNT,0,1
|
||||
MAX_ITEM_AMOUNT,9999999,1
|
||||
ONE_MEGA_BYTE_TO_BYTE,1048576,1
|
||||
DEFAULT_USER_NAME,Tutorial in progress,1
|
||||
DEFAULT_USER_COMMENT,Lean and Play!,1
|
||||
DEFAULT_MASTER_TITLE_ID,0,1
|
||||
ADV_BGM_VOLUME_COEFFICIENT,1,1
|
||||
ADV_SE_VOLUME_COEFFICIENT,1,1
|
||||
ADV_VOICE_VOLUME_COEFFICIENT,1,1
|
||||
MOVIE_HISTORY_NUM,5,1
|
||||
MOVIE_EXPIRY_DAY,60,1
|
||||
MOVIE_DELETE_NUM,4,1
|
||||
TUTORIAL_MIN_LOTTERY_ID,9000000,1
|
||||
TUTORIAL_GUEST_USER_NAME,A Nice Guest,1
|
||||
TUTORIAL_GUEST_USER_RANK,10,1
|
||||
TUTORIAL_GUEST_USER_MASTER_CARD_ID,10010013,1
|
||||
TUTORIAL_GUEST_USER_CARD_LEVEL,5,1
|
||||
TUTORIAL_GUEST_USER_COMMENT,Enjoy the first live show!,1
|
||||
TUTORIAL_GUEST_USER_TITLE_ID,3000001,1
|
||||
TUTORIAL_MASTER_STORY_PART_ID,11000101,1
|
||||
TUTORIAL_MASTER_TALK_ID,90000001,1
|
||||
TUTORIAL_SPEECH_BUBBLE_MISSION_1,1605001,1
|
||||
TUTORIAL_SPEECH_BUBBLE_MISSION_2,1663001,1
|
||||
TUTORIAL_SPEECH_BUBBLE_MISSION_3,1614001,1
|
||||
COMEBACK_LOGIN_BONUS_REQUIRE_DAYS,14,1
|
||||
BANNER_MOVE_SECOND,5,1
|
||||
MIN_GIFT,0,1
|
||||
MAX_GIFT,100000,1
|
||||
GIFT_EXPIRE_DAY,30,1
|
||||
MAX_GIFT_HISTORY,30,1
|
||||
PRESENT_BOX_EXPIRE_NOTIFY_HOUR,24,1
|
||||
MAX_FRIEND_REQUEST,40,1
|
||||
MAX_FRIEND_PENDING,40,1
|
||||
MAX_FRIEND_SEARCH,20,1
|
||||
SCORE_TOTAL_POWER_COEFFICIENT,3,1
|
||||
SCORE_DECK_POWER_COEFFICIENT,0.0125,1
|
||||
SCORE_LEVEL_ADJUST_COEFFICIENT,0.01,1
|
||||
SCORE_LEVEL_MIN_COEFFICIENT,1,1
|
||||
LIVESCENE_SKILLNAME_MAX_LENGTH,80,1
|
||||
LOCAL_P3_SERVICE_END,2024/5/31 6:00:00,224031103
|
||||
LOCAL_P4_REFUND_START,2024/5/31 6:00:00,224031103
|
||||
LOCAL_P5_REFUND_END,2024/5/31 6:00:00,224031103
|
||||
LIVESCENE_SKILLNAME_ELLIPSIS,...,1
|
||||
HIGH_SCORE_RATE_COEFFICIENT,5000,1
|
||||
HIGH_SCORE_RATE_LIST_MAX,10,1
|
||||
MIN_MUSIC_LEVEL_NUMBER,5,1
|
||||
LIVE_CONTINUE_USE_GEM,100,1
|
||||
MULTI_REGION,jp,223061503
|
||||
MULTI_LIVE_TIME_OUT,15,223061503
|
||||
MULTI_PRIVATE_ROOM_PASS,0123456789,223061503
|
||||
MULTI_PRIVATE_ROOM_PASS_COUNT,6,223061503
|
||||
LIVE_ERORR_TIME,5,1
|
||||
EVENT_POINT_SCORE_BONUS_NUMERATOR,1,1
|
||||
EVENT_POINT_SCORE_BONUS_DENOMINATOR,2,1
|
||||
EVENT_POINT_ADJUST_NUMBER,0.25,1
|
||||
MAX_EVENT_POINT,999999999,1
|
||||
MULTI_ROOM_MIN_ID,1000000,1
|
||||
MULTI_ROOM_MAX_ID,99999999,1
|
||||
MULTI_PRIVATE_ROOM_MIN_ID,0,1
|
||||
MULTI_PRIVATE_ROOM_MAX_ID,999999,1
|
||||
MULTI_PRIVATE_ROOM_ID_FORMAT,000000,1
|
||||
MULTI_COMMENT_MAX_NUM,10,1
|
||||
MULTI_MUSIC_SELECT_TIME,20,1
|
||||
MULTI_LEVEL_SELECT_TIME,15,1
|
||||
MULTI_LAST_CONFIRM_TIME,20,1
|
||||
MULTI_PENALTY_DEFAULT_ID,1,1
|
||||
MULTI_PENALTY_NO_PLAY_MISS_RATIO,5000,1
|
||||
MULTI_EVENT_LIVE_GREAT_PERFECT_NOTES_MIN_RATIO,50,1
|
||||
MULTI_PENALTY_MISS_RATIO,70,1
|
||||
LIVE_POWER_ZERO_SCORE_COEFFICIENT,0.1,1
|
||||
STAMP_ONE_PAGE_NUM,16,1
|
||||
COUNT_BADGE_MAX,99,1
|
||||
MUSIC_CHANGE_PRICE,50000,223111506
|
||||
DAILY_FREE_MUSIC_CHANGE_LIMIT,1,223111506
|
||||
STAR_ASSIST_SKILL_PROBABILITY,20000,223111506
|
||||
STAR_EVENT_BONUS_MAX_DAILY_COUNT,5,223111506
|
||||
STAR_EVENT_BONUS_COEFFICIENT,50,223111506
|
||||
STAR_BONUS_COEFFICIENT,2,223111506
|
||||
STAR_ASSIST_CARD_BONUS_COEFFICIENT,10000,223111506
|
||||
STAR_ASSIST_CARD_COEFFICIENT,90000,223111506
|
||||
STAR_ASSIST_SKILL_COEFFICIENT_1,9,223111506
|
||||
STAR_ASSIST_SKILL_COEFFICIENT_2,15,223111506
|
||||
MIN_SKILL_LEVEL,0,1
|
||||
MAX_SKILL_LEVEL,9,1
|
||||
SKILL_REINFORCE_SAME_CARD_RATIO,30000,1
|
||||
CHARACTER_FRIENDSHIP_MAX,500000,1
|
||||
CHARACTER_FRIENDSHIP_REWARD_BASE,1,1
|
||||
CHARACTER_FRIENDSHIP_CENTER_BONUS,5,1
|
||||
CHARACTER_FRIENDSHIP_FRONT_BONUS,2,1
|
||||
CARD_EPISODE_REWARD_GEM,50,1
|
||||
LOTTERY_SINGLE_TICKET,15010001,1
|
||||
LOTTERY_MULTI_TICKET,15010003,1
|
||||
COMMON_LOTTERY_EXCHANGE_MASTER_ITEM_ID,17001002,1
|
||||
EXCHANGE_CARD_LOTTERY_EFF_STEP_MOVIE_MASTER_ID,1,1
|
||||
EXCHANGE_CARD_LOTTERY_EFF_EXPECTED_MASTER_ID,1,1
|
||||
EXCHANGE_CARD_LOTTERY_EFF_ARTIST_MOVIE_MASTER_ID,1,1
|
||||
PLAYER_RANKS_TRACKING_LIST,[5/10/30/50/100/200/300/],1
|
||||
MUSE_STORY_TRACKING_LIST,story_part MASTER id LIST (CHAPTER 1~5),1
|
||||
AQOURS_STORY_TRACKING_LIST,story_part MASTER id LIST (CHAPTER 1~5),1
|
||||
NIGIGASAKI_STORY_TRACKING_LIST,story_part MASTER id LIST (CHAPTER 1~5),1
|
||||
LIELLA_STORY_TRACKING_LIST,story_part MASTER id LIST (CHAPTER 1~5),1
|
||||
USERNAME_COMPLETE,cxaf1k,1
|
||||
TUTORIAL_COMPLETE,usrdzo,1
|
||||
TUTORIAL_EXCLUDE_MEMBER,[4010/4011],223121502
|
||||
LOGIN_BONUS,253c9m,1
|
||||
PURCHASE,1bsthi,1
|
||||
INITIAL_PURCHASE,ydtj0o,1
|
||||
RANK_005,gd5k9i,1
|
||||
RANK_010,32vmx1,1
|
||||
RANK_030,o7jsyo,1
|
||||
RANK_050,a8x3q0,1
|
||||
RANK_100,2t4qed,1
|
||||
RANK_200,6910uf,1
|
||||
RANK_300,z7sc9p,1
|
||||
REJECT_PURCHASE_FLAG,TRUE,224012502
|
||||
STORYCLEAR_MS_01,xw39p7,1
|
||||
STORYCLEAR_MS_02,k0e5zr,1
|
||||
STORYCLEAR_MS_03,tbne9l,1
|
||||
STORYCLEAR_MS_04,ydfmv4,1
|
||||
STORYCLEAR_MS_05,v3kowc,1
|
||||
STORYCLEAR_AQOURS_01,1y4ciq,1
|
||||
STORYCLEAR_AQOURS_02,2x9bkp,1
|
||||
STORYCLEAR_AQOURS_03,l0ynyt,1
|
||||
STORYCLEAR_AQOURS_04,7fhbyg,1
|
||||
STORYCLEAR_AQOURS_05,mxlplg,1
|
||||
STORYCLEAR_NIJI_01,h9iti9,1
|
||||
STORYCLEAR_NIJI_02,c2bx53,1
|
||||
STORYCLEAR_NIJI_03,jxthtq,1
|
||||
STORYCLEAR_NIJI_04,thehu8,1
|
||||
STORYCLEAR_NIJI_05,g04pim,1
|
||||
SS_ALIGNMENT_END_DATETIME,2024/12/31 14:59:59,223071201
|
||||
SS_THEATER_NOT_FOUND,Daily theater will be updated later.,223120502
|
||||
DEFAULT_LIVE_POWER,1000,1
|
||||
MAX_LIVE_POWER,2000,1
|
||||
DEFAULT_ROOM_MASTER_AREA_ID,100,1
|
||||
AUTO_TICKET_MASTER_ITEM_ID,90000001,1
|
||||
EVOLVE_RARE3_MASTER_ITEM_ID,21001001,1
|
||||
EVOLVE_RARE4_MASTER_ITEM_ID,21002001,1
|
||||
EVOLVE_RARE3_NEED_ITEM_COUNT,10,1
|
||||
EVOLVE_RARE4_NEED_ITEM_COUNT,10,1
|
||||
EVOLVE_ITEM_COUNT_MAX,999,1
|
||||
SPIRIT_SCORE_BONUS_NUMERATOR,1,1
|
||||
SPIRIT_SCORE_BONUS_DENOMINATOR,6,1
|
||||
SPIRIT_ADJUST_NUMBER,50,1
|
||||
BEFORE_RECOMMEND_EMPTY_ID,10013001,1
|
||||
DEFAULT_MAX_ORNAMENT_LEVEL,5,1
|
||||
TUTORIAL_CARD_REINFORCE_MASTER_ITEM_ID,16001002,1
|
||||
BATTERY_CHECK_NUM,30,1
|
||||
EVENT_LIVE_POINT_BOOST,40,1
|
||||
CARD_SPECIAL_EPISODE_REWARD_GEM,100,1
|
||||
TALK_USER_EXP_BASE,200,1
|
||||
SERIF_HIDE_TIME,5,1
|
||||
AREA_WORLD_ID_DEFAULT,1,1
|
||||
AREA_WORLD_ID_BIRTHDAY,2,1
|
||||
MIN_NEW_ORNAMENT_EVENT,1,1
|
||||
MAX_NEW_ORNAMENT_EVENT,3,1
|
||||
MIN_NEW_MAIN_AREA_EVENT,4,1
|
||||
MAX_NEW_MAIN_AREA_EVENT,8,1
|
||||
MAX_MAIN_AREA_EVENT,20,1
|
||||
MIN_MAIN_AREA_EVENT_PER_AREA,1,1
|
||||
MAX_MAIN_AREA_EVENT_PER_AREA,3,1
|
||||
AREA_EVENT_PER_AREA,4,1
|
||||
AREA_TALK_BALLOON_VIEW_MSEC,5000,1
|
||||
AREA_TALK_BALLOON_INTERVAL_MSEC,10000,1
|
||||
CANDY_SCORE_BONUS_NUMERATOR,1,1
|
||||
CANDY_SCORE_BONUS_DENOMINATOR,6,1
|
||||
CANDY_ADJUST_NUMBER,50,1
|
||||
PICK_SCORE_BONUS_NUMERATOR,1,1
|
||||
PICK_SCORE_BONUS_DENOMINATOR,6,1
|
||||
PICK_ADJUST_NUMBER,50,1
|
||||
EVENT_COIN_SCORE_BONUS_NUMERATOR,1,1
|
||||
EVENT_COIN_SCORE_BONUS_DENOMINATOR,6,1
|
||||
EVENT_COIN_ADJUST_NUMBER,50,1
|
||||
EVENT_HOMEWORK_CLEAR_BONUS,2,1
|
||||
MAX_LOTTERY_BOX_DRAW_COUNT,10,1
|
||||
EVENT_TOP_LIVE2D_EVENT_TALK_PERCENT,70,1
|
||||
|
56
src/router/databases/csv-en/date_condition.csv
Normal file
56
src/router/databases/csv-en/date_condition.csv
Normal file
@@ -0,0 +1,56 @@
|
||||
_id,_dateConditionType,_arg1,_arg2,_arg3,_masterReleaseLabelId
|
||||
1,1,1,1,0,1
|
||||
2,1,2,3,0,1
|
||||
3,1,2,14,0,1
|
||||
4,1,3,3,0,1
|
||||
5,1,3,14,0,1
|
||||
6,1,5,5,0,1
|
||||
7,1,7,7,0,1
|
||||
8,2,7,1,3,1
|
||||
9,3,1,0,0,1
|
||||
10,1,10,31,0,1
|
||||
11,1,12,25,0,1
|
||||
12,1,12,31,0,1
|
||||
13,0,1001,0,0,1
|
||||
14,0,1002,0,0,1
|
||||
15,0,1003,0,0,1
|
||||
16,0,1004,0,0,1
|
||||
17,0,1005,0,0,1
|
||||
18,0,1006,0,0,1
|
||||
19,0,1007,0,0,1
|
||||
20,0,1008,0,0,1
|
||||
21,0,1009,0,0,1
|
||||
22,0,2001,0,0,1
|
||||
23,0,2002,0,0,1
|
||||
24,0,2003,0,0,1
|
||||
25,0,2004,0,0,1
|
||||
26,0,2005,0,0,1
|
||||
27,0,2006,0,0,1
|
||||
28,0,2007,0,0,1
|
||||
29,0,2008,0,0,1
|
||||
30,0,2009,0,0,1
|
||||
31,0,3001,0,0,1
|
||||
32,0,3002,0,0,1
|
||||
33,0,3003,0,0,1
|
||||
34,0,3004,0,0,1
|
||||
35,0,3005,0,0,1
|
||||
36,0,3006,0,0,1
|
||||
37,0,3007,0,0,1
|
||||
38,0,3008,0,0,1
|
||||
39,0,3009,0,0,1
|
||||
40,0,3010,0,0,1
|
||||
41,0,3011,0,0,1
|
||||
42,0,3012,0,0,1
|
||||
43,0,4001,0,0,1
|
||||
44,0,4002,0,0,1
|
||||
45,0,4003,0,0,1
|
||||
46,0,4004,0,0,1
|
||||
47,0,4005,0,0,1
|
||||
48,0,4006,0,0,1
|
||||
49,0,4007,0,0,1
|
||||
50,0,4008,0,0,1
|
||||
51,0,4009,0,0,1
|
||||
52,3,2,0,0,223062402
|
||||
53,1,10,15,0,223101514
|
||||
54,0,4010,0,0,223121502
|
||||
55,0,4011,0,0,223121502
|
||||
|
6
src/router/databases/csv-en/date_condition_others.csv
Normal file
6
src/router/databases/csv-en/date_condition_others.csv
Normal file
@@ -0,0 +1,6 @@
|
||||
_id,_num,_date,_masterReleaseLabelId
|
||||
1,1,2022/09/10,1
|
||||
1,2,2023/09/29,1
|
||||
1,3,2024/09/17,1
|
||||
2,1,2023/06/24,223062402
|
||||
2,2,2023/06/25,223062402
|
||||
|
460
src/router/databases/csv-en/dialog.csv
Normal file
460
src/router/databases/csv-en/dialog.csv
Normal file
File diff suppressed because one or more lines are too long
21
src/router/databases/csv-en/dialog_button.csv
Normal file
21
src/router/databases/csv-en/dialog_button.csv
Normal file
@@ -0,0 +1,21 @@
|
||||
_id,_spriteName,_masterTextId,_masterTextIdColor,_masterReleaseLabelId
|
||||
CloseButton,common_img_white,Button_Close,Common_BlackText,1
|
||||
OkButton,common_img_white,Button_Ok,Common_WhiteText,1
|
||||
CancelButton,common_img_white,Button_Cancel,Common_BlackText,1
|
||||
CloseOkButton,common_img_white,Button_Ok,Common_WhiteText,1
|
||||
UpdateButton,common_img_white,Button_Update,Common_WhiteText,1
|
||||
RetryButton,common_img_white,Button_Retry,Common_WhiteText,1
|
||||
DownloadButton,common_img_white,Button_Download,Common_WhiteText,1
|
||||
VoiceOnButton,common_img_white,Button_VoiceOn,Common_GrayText,1
|
||||
VoiceOffButton,common_img_white,Button_VoiceOff,Common_GrayText,1
|
||||
ReturnButton,common_img_white,Button_Return,Common_BlackText,1
|
||||
ResumeButton,common_img_white,Button_Resume,Common_WhiteText,1
|
||||
SuspendButton,common_img_white,Button_Suspend,Common_BlackText,1
|
||||
SkipButton,common_img_white,Button_Skip,Common_BlackText,1
|
||||
RestartButton,common_img_white,Button_Restart,Common_WhiteText,1
|
||||
ShopButton,common_img_white,Button_Shop,Common_WhiteText,1
|
||||
HomeButton,common_img_white,Button_Home,Common_WhiteText,1
|
||||
BuyGemButton,common_img_white,Button_BuyGem,Common_WhiteText,1
|
||||
PresentBoxButton,common_img_white,Button_PresentBox,Common_WhiteText,1
|
||||
ChatButton,common_img_white,Button_Chat,Common_WhiteText,1
|
||||
ReleaseButton,common_img_white,Button_Release,Common_WhiteText,1
|
||||
|
42
src/router/databases/csv-en/event.csv
Normal file
42
src/router/databases/csv-en/event.csv
Normal file
@@ -0,0 +1,42 @@
|
||||
_id,_name,_type,_memberRankingType,_resultClosedDate,_aggregationDate,_rewardMemberMasterCardIdList,_masterEventPointSettingsId,_openingObjName,_openingGroupBg,_favoriteMemberSettingCharacterIds,_masterReleaseLabelId
|
||||
101,Operation: Slump Escape!,1,1,2023/05/01 4:59:59,2023/04/30 4:59:59,40030009,101,,0,,223041903
|
||||
102,Take a Look at Our Town,1,1,2023/05/12 4:59:59,2023/05/11 4:59:59,10090015,102,,0,,223043004
|
||||
103,Free Tour,2,0,2023/05/16 4:59:59,2023/05/15 4:59:59,,103,,0,,223051101
|
||||
104,Come Have Fun in Numazu,1,1,2023/05/27 4:59:59,2023/05/26 4:59:59,20070013,104,,0,,223051504
|
||||
105,Free Tour,2,0,2023/06/01 4:59:59,2023/05/31 4:59:59,,105,,0,,223052601
|
||||
106,"Imagine, Connect, Network!",1,1,2023/06/12 4:59:59,2023/06/11 4:59:59,30090009,106,,0,,223053104
|
||||
107,Free Tour,2,0,2023/06/20 4:59:59,2023/06/19 4:59:59,,107,,0,,223061101
|
||||
108,Teamup Live Show,3,0,2023/06/30 4:59:59,2023/06/29 4:59:59,20090013,108,MultiOpRoot,2,,223061504
|
||||
109,Seagull Mayhem Delivery,1,1,2023/07/12 4:59:59,2023/07/11 4:59:59,40060010,109,,0,,223063004
|
||||
110,Free Tour,2,0,2023/07/16 4:59:59,2023/07/15 4:59:59,,110,,0,,223071101
|
||||
111,Teamup Live Show,3,0,2023/07/27 4:59:59,2023/07/26 4:59:59,30020009,111,MultiOpRoot,3,,223071505
|
||||
112,Free Tour,2,0,2023/08/01 4:59:59,2023/07/31 4:59:59,,112,,0,,223072601
|
||||
113,Beach Flag Racing,1,1,2023/08/12 4:59:59,2023/08/11 4:59:59,10040016,113,,0,,223073104
|
||||
114,Free Tour,2,0,2023/08/16 4:59:59,2023/08/15 4:59:59,,114,,0,,223081101
|
||||
115,Teamup Live Show,3,0,2023/08/27 4:59:59,2023/08/26 4:59:59,40010011,115,MultiOpRoot,4,,223081504
|
||||
116,Free Tour,2,0,2023/09/01 4:59:59,2023/08/31 4:59:59,,116,,0,,223082601
|
||||
117,Silver Moon to Shining Knoll,1,1,2023/09/12 4:59:59,2023/09/11 4:59:59,20050014,117,,0,,223083104
|
||||
118,Free Tour,2,0,2023/09/16 4:59:59,2023/09/15 4:59:59,,118,,0,,223091101
|
||||
119,Teamup Live Show,3,0,2023/09/27 4:59:59,2023/09/26 4:59:59,10080016,119,MultiOpRoot,1,,223091504
|
||||
120,Free Tour,2,0,2023/09/30 4:59:59,2023/09/29 4:59:59,,120,,0,,223092601
|
||||
121,Halloween: What's Gonna Jump out at Me?!,1,1,2023/10/12 4:59:59,2023/10/11 4:59:59,30030010,121,,0,,223093004
|
||||
122,Free Tour,2,0,2023/10/15 4:59:59,2023/10/14 4:59:59,,122,,0,,223101101
|
||||
123,Half Anniversary,1,1,2023/10/27 4:59:59,2023/10/26 4:59:59,20030015,123,,0,,223101508
|
||||
124,Free Tour,2,0,2023/10/31 4:59:59,2023/10/30 4:59:59,,124,,0,,223102601
|
||||
125,Pit-a-pat School Information Session,1,1,2024/02/22 7:59:59,2024/02/21 7:59:59,40090011,125,,0,,223103104
|
||||
126,Free Tour,2,0,2024/02/25 7:59:59,2024/02/24 7:59:59,,126,,0,,223111101
|
||||
127,Star Challenge,4,0,2024/03/14 7:59:59,2024/03/13 7:59:59,30040012,127,StarEventOpRoot,0,,223111504
|
||||
128,Free Tour,2,0,2024/03/17 4:59:59,2024/03/16 4:59:59,,128,,0,,223112601
|
||||
129,Christmas Parties Are The Best!,1,1,2024/03/27 7:59:59,2024/03/26 7:59:59,10010020,129,,0,,223113004
|
||||
130,Free Tour,2,0,2024/03/31 7:59:59,2024/03/30 7:59:59,,130,,0,,223121102
|
||||
131,Teamup Live Show,3,0,2024/04/11 7:59:59,2024/04/10 7:59:59,40080011,131,MultiOpRoot,4,,223121507
|
||||
132,Free Tour,2,0,2024/04/16 7:59:59,2024/04/15 7:59:59,,132,,0,,223122603
|
||||
133,"Awashima Isle,HAPPY NEW YEAR!",1,1,2024/04/27 7:59:59,2024/04/26 7:59:59,20010019,133,,0,,223123104
|
||||
134,Free Tour,2,0,2024/05/01 7:59:59,2024/04/30 7:59:59,,134,,0,,224011106
|
||||
135,Star Challenge,4,0,2024/05/12 7:59:59,2024/05/11 7:59:59,10050018,135,StarEventOpRoot,0,,224011504
|
||||
136,Free Tour,2,0,2024/05/16 7:59:59,2024/05/15 7:59:59,,136,,0,,224012702
|
||||
137,Who Will Get the Chocolate?!,1,0,2024/05/26 7:59:59,2024/05/24 9:59:59,30010017,137,,0,,224013104
|
||||
138,Free Tour,2,0,2024/05/30 7:59:59,2024/05/29 7:59:59,,138,,0,,224021006
|
||||
139,Star Challenge,4,0,2024/06/10 7:59:59,2024/06/09 7:59:59,20080016,139,StarEventOpRoot,0,,224021404
|
||||
140,Free Tour,2,0,2024/06/14 7:59:59,2024/06/13 7:59:59,,140,,0,,224022305
|
||||
141,Feelings Come Across on White Day,1,1,2024/06/25 7:59:59,2024/06/24 7:59:59,40040013,141,,0,,224030104
|
||||
|
82
src/router/databases/csv-en/event_card_bonus.csv
Normal file
82
src/router/databases/csv-en/event_card_bonus.csv
Normal file
@@ -0,0 +1,82 @@
|
||||
_masterEventId,_targetId,_pointBonusRatioList,_eventTicketBonusAmountList,_masterReleaseLabelId
|
||||
101,40090009,"1000,2000,0,0,0","250,500,0,0,0",223041903
|
||||
101,40020009,"1000,2000,0,0,0","250,500,0,0,0",223041903
|
||||
101,40030009,"1000,2000,0,0,0","250,500,0,0,0",223041903
|
||||
102,10010016,"1000,2000,0,0,0","250,500,0,0,0",223043004
|
||||
102,10020015,"1000,2000,0,0,0","250,500,0,0,0",223043004
|
||||
102,10090015,"1000,2000,0,0,0","250,500,0,0,0",223043004
|
||||
102,40090009,"0,0,0,0,0","250,500,0,0,0",223043004
|
||||
102,40020009,"0,0,0,0,0","250,500,0,0,0",223043004
|
||||
102,40030009,"0,0,0,0,0","250,500,0,0,0",223043004
|
||||
104,20010014,"1000,2000,0,0,0","250,500,0,0,0",223051504
|
||||
104,20020013,"1000,2000,0,0,0","250,500,0,0,0",223051504
|
||||
104,20070013,"1000,2000,0,0,0","250,500,0,0,0",223051504
|
||||
104,10010016,"0,0,0,0,0","250,500,0,0,0",223051504
|
||||
104,10020015,"0,0,0,0,0","250,500,0,0,0",223051504
|
||||
104,10090015,"0,0,0,0,0","250,500,0,0,0",223051504
|
||||
106,30060009,"1000,2000,0,0,0","250,500,0,0,0",223053104
|
||||
106,30080009,"1000,2000,0,0,0","250,500,0,0,0",223053104
|
||||
106,30090009,"1000,2000,0,0,0","250,500,0,0,0",223053104
|
||||
106,20010014,"0,0,0,0,0","250,500,0,0,0",223053104
|
||||
106,20020013,"0,0,0,0,0","250,500,0,0,0",223053104
|
||||
106,20070013,"0,0,0,0,0","250,500,0,0,0",223053104
|
||||
109,40040009,"1000,2000,0,0,0","250,500,0,0,0",223063004
|
||||
109,40050009,"1000,2000,0,0,0","250,500,0,0,0",223063004
|
||||
109,40060010,"1000,2000,0,0,0","250,500,0,0,0",223063004
|
||||
109,30060009,"0,0,0,0,0","250,500,0,0,0",223063004
|
||||
109,30080009,"0,0,0,0,0","250,500,0,0,0",223063004
|
||||
109,30090009,"0,0,0,0,0","250,500,0,0,0",223063004
|
||||
113,10030016,"1000,2000,0,0,0","250,500,0,0,0",223073104
|
||||
113,10050015,"1000,2000,0,0,0","250,500,0,0,0",223073104
|
||||
113,10040016,"1000,2000,0,0,0","250,500,0,0,0",223073104
|
||||
113,40040009,"0,0,0,0,0","250,500,0,0,0",223073104
|
||||
113,40050009,"0,0,0,0,0","250,500,0,0,0",223073104
|
||||
113,40060010,"0,0,0,0,0","250,500,0,0,0",223073104
|
||||
117,20060015,"1000,2000,0,0,0","250,500,0,0,0",223083104
|
||||
117,20080014,"1000,2000,0,0,0","250,500,0,0,0",223083104
|
||||
117,20050014,"1000,2000,0,0,0","250,500,0,0,0",223083104
|
||||
117,10030016,"0,0,0,0,0","250,500,0,0,0",223083104
|
||||
117,10050015,"0,0,0,0,0","250,500,0,0,0",223083104
|
||||
117,10040016,"0,0,0,0,0","250,500,0,0,0",223083104
|
||||
121,30120010,"1000,2000,0,0,0","250,500,0,0,0",223093004
|
||||
121,30110010,"1000,2000,0,0,0","250,500,0,0,0",223093004
|
||||
121,30030010,"1000,2000,0,0,0","250,500,0,0,0",223093004
|
||||
121,20060015,"0,0,0,0,0","250,500,0,0,0",223093004
|
||||
121,20080014,"0,0,0,0,0","250,500,0,0,0",223093004
|
||||
121,20050014,"0,0,0,0,0","250,500,0,0,0",223093004
|
||||
123,20070015,"1000,2000,0,0,0","250,500,0,0,0",223101508
|
||||
123,20040015,"1000,2000,0,0,0","250,500,0,0,0",223101508
|
||||
123,20030015,"1000,2000,0,0,0","250,500,0,0,0",223101508
|
||||
123,10060015,"0,0,0,0,0","250,500,0,0,0",223101508
|
||||
123,10070017,"0,0,0,0,0","250,500,0,0,0",223101508
|
||||
123,10080016,"0,0,0,0,0","250,500,0,0,0",223101508
|
||||
125,40030012,"1000,2000,0,0,0","250,500,0,0,0",223103104
|
||||
125,40060011,"1000,2000,0,0,0","250,500,0,0,0",223103104
|
||||
125,40090011,"1000,2000,0,0,0","250,500,0,0,0",223103104
|
||||
125,30120010,"0,0,0,0,0","250,500,0,0,0",223103104
|
||||
125,30110010,"0,0,0,0,0","250,500,0,0,0",223103104
|
||||
125,30030010,"0,0,0,0,0","250,500,0,0,0",223103104
|
||||
129,10040019,"1000,2000,0,0,0","250,500,0,0,0",223113004
|
||||
129,10090018,"1000,2000,0,0,0","250,500,0,0,0",223113004
|
||||
129,10010020,"1000,2000,0,0,0","250,500,0,0,0",223113004
|
||||
129,40030012,"0,0,0,0,0","250,500,0,0,0",223113004
|
||||
129,40060011,"0,0,0,0,0","250,500,0,0,0",223113004
|
||||
129,40090011,"0,0,0,0,0","250,500,0,0,0",223113004
|
||||
133,20050017,"1000,2000,0,0,0","250,500,0,0,0",223123104
|
||||
133,20090016,"1000,2000,0,0,0","250,500,0,0,0",223123104
|
||||
133,20010019,"1000,2000,0,0,0","250,500,0,0,0",223123104
|
||||
133,10040019,"0,0,0,0,0","250,500,0,0,0",223123104
|
||||
133,10090018,"0,0,0,0,0","250,500,0,0,0",223123104
|
||||
133,10010020,"0,0,0,0,0","250,500,0,0,0",223123104
|
||||
137,30030014,"1000,2000,0,0,0","250,500,0,0,0",224013104
|
||||
137,30040014,"1000,2000,0,0,0","250,500,0,0,0",224013104
|
||||
137,30010017,"1000,2000,0,0,0","250,500,0,0,0",224013104
|
||||
137,20050017,"0,0,0,0,0","250,500,0,0,0",224013104
|
||||
137,20090016,"0,0,0,0,0","250,500,0,0,0",224013104
|
||||
137,20010019,"0,0,0,0,0","250,500,0,0,0",224013104
|
||||
141,40050013,"1000,2000,0,0,0","250,500,0,0,0",224030104
|
||||
141,40070013,"1000,2000,0,0,0","250,500,0,0,0",224030104
|
||||
141,40040013,"1000,2000,0,0,0","250,500,0,0,0",224030104
|
||||
141,30030014,"0,0,0,0,0","250,500,0,0,0",224030104
|
||||
141,30040014,"0,0,0,0,0","250,500,0,0,0",224030104
|
||||
141,30010017,"0,0,0,0,0","250,500,0,0,0",224030104
|
||||
|
15
src/router/databases/csv-en/event_live.csv
Normal file
15
src/router/databases/csv-en/event_live.csv
Normal file
@@ -0,0 +1,15 @@
|
||||
_masterEventId,_masterLiveId,_masterReleaseLabelId
|
||||
101,1407101,223041903
|
||||
102,1103501,223043004
|
||||
104,1214201,223051504
|
||||
106,1311901,223053104
|
||||
109,1404801,223063004
|
||||
113,1110401,223073104
|
||||
117,1204601,223083104
|
||||
121,1311801,223093004
|
||||
123,1205501,223101508
|
||||
125,1403701,223103104
|
||||
129,1100801,223113004
|
||||
133,1209601,223123104
|
||||
137,1307801,224013104
|
||||
141,1400301,224030104
|
||||
|
2045
src/router/databases/csv-en/event_member_ranking.csv
Normal file
2045
src/router/databases/csv-en/event_member_ranking.csv
Normal file
File diff suppressed because it is too large
Load Diff
9292
src/router/databases/csv-en/event_member_ranking_reward.csv
Normal file
9292
src/router/databases/csv-en/event_member_ranking_reward.csv
Normal file
File diff suppressed because it is too large
Load Diff
3456
src/router/databases/csv-en/event_point.csv
Normal file
3456
src/router/databases/csv-en/event_point.csv
Normal file
File diff suppressed because it is too large
Load Diff
274
src/router/databases/csv-en/event_point_ranking.csv
Normal file
274
src/router/databases/csv-en/event_point_ranking.csv
Normal file
@@ -0,0 +1,274 @@
|
||||
_masterEventId,_groupId,_number,_highRank,_lowRank,_masterEventPointRankingRewardId,_masterReleaseLabelId
|
||||
101,0,1,1,500,280010101,223041903
|
||||
101,0,2,501,3000,280010102,223041903
|
||||
101,0,3,3001,10000,280010103,223041903
|
||||
101,0,4,10001,20000,280010104,223041903
|
||||
101,0,5,20001,50000,280010105,223041903
|
||||
101,0,6,50001,100000,280010106,223041903
|
||||
101,0,7,100001,150000,280010107,223041903
|
||||
101,0,8,150001,250000,280010108,223041903
|
||||
101,0,9,250001,500000,280010109,223041903
|
||||
101,0,10,500001,1000000,280010110,223041903
|
||||
102,0,1,1,500,280010201,223043004
|
||||
102,0,2,501,3000,280010202,223043004
|
||||
102,0,3,3001,10000,280010203,223043004
|
||||
102,0,4,10001,20000,280010204,223043004
|
||||
102,0,5,20001,50000,280010205,223043004
|
||||
102,0,6,50001,100000,280010206,223043004
|
||||
102,0,7,100001,150000,280010207,223043004
|
||||
102,0,8,150001,250000,280010208,223043004
|
||||
102,0,9,250001,500000,280010209,223043004
|
||||
102,0,10,500001,1000000,280010210,223043004
|
||||
104,0,1,1,500,280010401,223051504
|
||||
104,0,2,501,3000,280010402,223051504
|
||||
104,0,3,3001,10000,280010403,223051504
|
||||
104,0,4,10001,20000,280010404,223051504
|
||||
104,0,5,20001,50000,280010405,223051504
|
||||
104,0,6,50001,100000,280010406,223051504
|
||||
104,0,7,100001,150000,280010407,223051504
|
||||
104,0,8,150001,250000,280010408,223051504
|
||||
104,0,9,250001,500000,280010409,223051504
|
||||
104,0,10,500001,1000000,280010410,223051504
|
||||
106,0,1,1,500,280010601,223053104
|
||||
106,0,2,501,3000,280010602,223053104
|
||||
106,0,3,3001,10000,280010603,223053104
|
||||
106,0,4,10001,20000,280010604,223053104
|
||||
106,0,5,20001,50000,280010605,223053104
|
||||
106,0,6,50001,100000,280010606,223053104
|
||||
106,0,7,100001,150000,280010607,223053104
|
||||
106,0,8,150001,250000,280010608,223053104
|
||||
106,0,9,250001,500000,280010609,223053104
|
||||
106,0,10,500001,1000000,280010610,223053104
|
||||
109,0,1,1,500,280010901,223063004
|
||||
109,0,2,501,1500,280010902,223063004
|
||||
109,0,3,1501,3000,280010903,223063004
|
||||
109,0,4,3001,5000,280010904,223063004
|
||||
109,0,5,5001,10000,280010905,223063004
|
||||
109,0,6,10001,20000,280010906,223063004
|
||||
109,0,7,20001,35000,280010907,223063004
|
||||
109,0,8,35001,50000,280010908,223063004
|
||||
109,0,9,50001,100000,280010909,223063004
|
||||
109,0,10,100001,1000000,280010910,223063004
|
||||
108,0,1,1,500,280010801,223061504
|
||||
108,0,2,501,3000,280010802,223061504
|
||||
108,0,3,3001,10000,280010803,223061504
|
||||
108,0,4,10001,20000,280010804,223061504
|
||||
108,0,5,20001,50000,280010805,223061504
|
||||
108,0,6,50001,100000,280010806,223061504
|
||||
108,0,7,100001,150000,280010807,223061504
|
||||
108,0,8,150001,250000,280010808,223061504
|
||||
108,0,9,250001,500000,280010809,223061504
|
||||
108,0,10,500001,1000000,280010810,223061504
|
||||
111,0,1,1,500,280011101,223071505
|
||||
111,0,2,501,1500,280011102,223071505
|
||||
111,0,3,1501,3000,280011103,223071505
|
||||
111,0,4,3001,5000,280011104,223071505
|
||||
111,0,5,5001,10000,280011105,223071505
|
||||
111,0,6,10001,20000,280011106,223071505
|
||||
111,0,7,20001,35000,280011107,223071505
|
||||
111,0,8,35001,50000,280011108,223071505
|
||||
111,0,9,50001,100000,280011109,223071505
|
||||
111,0,10,100001,1000000,280011110,223071505
|
||||
113,0,1,1,500,280011301,223073104
|
||||
113,0,2,501,1500,280011302,223073104
|
||||
113,0,3,1501,3000,280011303,223073104
|
||||
113,0,4,3001,5000,280011304,223073104
|
||||
113,0,5,5001,10000,280011305,223073104
|
||||
113,0,6,10001,20000,280011306,223073104
|
||||
113,0,7,20001,35000,280011307,223073104
|
||||
113,0,8,35001,50000,280011308,223073104
|
||||
113,0,9,50001,100000,280011309,223073104
|
||||
113,0,10,100001,1000000,280011310,223073104
|
||||
115,0,1,1,500,280011501,223081504
|
||||
115,0,2,501,1500,280011502,223081504
|
||||
115,0,3,1501,3000,280011503,223081504
|
||||
115,0,4,3001,5000,280011504,223081504
|
||||
115,0,5,5001,10000,280011505,223081504
|
||||
115,0,6,10001,20000,280011506,223081504
|
||||
115,0,7,20001,35000,280011507,223081504
|
||||
115,0,8,35001,50000,280011508,223081504
|
||||
115,0,9,50001,100000,280011509,223081504
|
||||
115,0,10,100001,1000000,280011510,223081504
|
||||
117,0,1,1,500,280011701,223083104
|
||||
117,0,2,501,1500,280011702,223083104
|
||||
117,0,3,1501,3000,280011703,223083104
|
||||
117,0,4,3001,5000,280011704,223083104
|
||||
117,0,5,5001,10000,280011705,223083104
|
||||
117,0,6,10001,20000,280011706,223083104
|
||||
117,0,7,20001,35000,280011707,223083104
|
||||
117,0,8,35001,50000,280011708,223083104
|
||||
117,0,9,50001,100000,280011709,223083104
|
||||
117,0,10,100001,1000000,280011710,223083104
|
||||
119,0,1,1,500,280011901,223091504
|
||||
119,0,2,501,1500,280011902,223091504
|
||||
119,0,3,1501,3000,280011903,223091504
|
||||
119,0,4,3001,5000,280011904,223091504
|
||||
119,0,5,5001,10000,280011905,223091504
|
||||
119,0,6,10001,20000,280011906,223091504
|
||||
119,0,7,20001,35000,280011907,223091504
|
||||
119,0,8,35001,50000,280011908,223091504
|
||||
119,0,9,50001,100000,280011909,223091504
|
||||
119,0,10,100001,1000000,280011910,223091504
|
||||
121,0,1,1,500,280012101,223093004
|
||||
121,0,2,501,1500,280012102,223093004
|
||||
121,0,3,1501,3000,280012103,223093004
|
||||
121,0,4,3001,5000,280012104,223093004
|
||||
121,0,5,5001,10000,280012105,223093004
|
||||
121,0,6,10001,20000,280012106,223093004
|
||||
121,0,7,20001,35000,280012107,223093004
|
||||
121,0,8,35001,50000,280012108,223093004
|
||||
121,0,9,50001,100000,280012109,223093004
|
||||
121,0,10,100001,1000000,280012110,223093004
|
||||
123,0,1,1,500,280012301,223101508
|
||||
123,0,2,501,1500,280012302,223101508
|
||||
123,0,3,1501,3000,280012303,223101508
|
||||
123,0,4,3001,5000,280012304,223101508
|
||||
123,0,5,5001,10000,280012305,223101508
|
||||
123,0,6,10001,20000,280012306,223101508
|
||||
123,0,7,20001,35000,280012307,223101508
|
||||
123,0,8,35001,50000,280012308,223101508
|
||||
123,0,9,50001,100000,280012309,223101508
|
||||
123,0,10,100001,1000000,280012310,223101508
|
||||
125,0,1,1,500,280012501,223103104
|
||||
125,0,2,501,1500,280012502,223103104
|
||||
125,0,3,1501,3000,280012503,223103104
|
||||
125,0,4,3001,5000,280012504,223103104
|
||||
125,0,5,5001,10000,280012505,223103104
|
||||
125,0,6,10001,20000,280012506,223103104
|
||||
125,0,7,20001,35000,280012507,223103104
|
||||
125,0,8,35001,50000,280012508,223103104
|
||||
125,0,9,50001,100000,280012509,223103104
|
||||
125,0,10,100001,1000000,280012510,223103104
|
||||
129,0,1,1,500,280012901,223113004
|
||||
129,0,2,501,1500,280012902,223113004
|
||||
129,0,3,1501,3000,280012903,223113004
|
||||
129,0,4,3001,5000,280012904,223113004
|
||||
129,0,5,5001,10000,280012905,223113004
|
||||
129,0,6,10001,20000,280012906,223113004
|
||||
129,0,7,20001,35000,280012907,223113004
|
||||
129,0,8,35001,50000,280012908,223113004
|
||||
129,0,9,50001,100000,280012909,223113004
|
||||
129,0,10,100001,1000000,280012910,223113004
|
||||
131,0,1,1,500,280013101,223121507
|
||||
131,0,2,501,1500,280013102,223121507
|
||||
131,0,3,1501,3000,280013103,223121507
|
||||
131,0,4,3001,5000,280013104,223121507
|
||||
131,0,5,5001,10000,280013105,223121507
|
||||
131,0,6,10001,20000,280013106,223121507
|
||||
131,0,7,20001,35000,280013107,223121507
|
||||
131,0,8,35001,50000,280013108,223121507
|
||||
131,0,9,50001,100000,280013109,223121507
|
||||
131,0,10,100001,1000000,280013110,223121507
|
||||
133,0,1,1,500,280013301,223123104
|
||||
133,0,2,501,1500,280013302,223123104
|
||||
133,0,3,1501,3000,280013303,223123104
|
||||
133,0,4,3001,5000,280013304,223123104
|
||||
133,0,5,5001,10000,280013305,223123104
|
||||
133,0,6,10001,20000,280013306,223123104
|
||||
133,0,7,20001,35000,280013307,223123104
|
||||
133,0,8,35001,50000,280013308,223123104
|
||||
133,0,9,50001,100000,280013309,223123104
|
||||
133,0,10,100001,1000000,280013310,223123104
|
||||
135,0,1,1,1,280013501,224011504
|
||||
135,0,2,2,2,280013502,224011504
|
||||
135,0,3,3,3,280013503,224011504
|
||||
135,0,4,4,10,280013504,224011504
|
||||
135,0,5,11,100,280013505,224011504
|
||||
135,0,6,101,200,280013506,224011504
|
||||
135,0,7,201,300,280013507,224011504
|
||||
135,0,8,301,500,280013508,224011504
|
||||
135,0,9,501,1000,280013509,224011504
|
||||
135,0,10,1001,2000,280013510,224011504
|
||||
135,0,11,2001,3000,280013511,224011504
|
||||
135,0,12,3001,4000,280013512,224011504
|
||||
135,0,13,4001,5000,280013513,224011504
|
||||
135,0,14,5001,10000,280013514,224011504
|
||||
135,0,15,10001,20000,280013515,224011504
|
||||
135,0,16,20001,35000,280013516,224011504
|
||||
135,0,17,35001,50000,280013517,224011504
|
||||
135,0,18,50001,100000,280013518,224011504
|
||||
135,0,19,100001,1000000,280013519,224011504
|
||||
137,0,1,1,500,280013701,224013104
|
||||
137,0,2,501,1500,280013702,224013104
|
||||
137,0,3,1501,3000,280013703,224013104
|
||||
137,0,4,3001,5000,280013704,224013104
|
||||
137,0,5,5001,10000,280013705,224013104
|
||||
137,0,6,10001,20000,280013706,224013104
|
||||
137,0,7,20001,35000,280013707,224013104
|
||||
137,0,8,35001,50000,280013708,224013104
|
||||
137,0,9,50001,100000,280013709,224013104
|
||||
137,0,10,100001,1000000,280013710,224013104
|
||||
139,0,1,1,1,280013901,224021404
|
||||
139,0,2,2,2,280013902,224021404
|
||||
139,0,3,3,3,280013903,224021404
|
||||
139,0,4,4,4,280013904,224021404
|
||||
139,0,5,5,5,280013905,224021404
|
||||
139,0,6,6,6,280013906,224021404
|
||||
139,0,7,7,7,280013907,224021404
|
||||
139,0,8,8,8,280013908,224021404
|
||||
139,0,9,9,9,280013909,224021404
|
||||
139,0,10,10,10,280013910,224021404
|
||||
139,0,11,11,11,280013911,224021404
|
||||
139,0,12,12,12,280013912,224021404
|
||||
139,0,13,13,13,280013913,224021404
|
||||
139,0,14,14,14,280013914,224021404
|
||||
139,0,15,15,15,280013915,224021404
|
||||
139,0,16,16,16,280013916,224021404
|
||||
139,0,17,17,17,280013917,224021404
|
||||
139,0,18,18,18,280013918,224021404
|
||||
139,0,19,19,19,280013919,224021404
|
||||
139,0,20,20,20,280013920,224021404
|
||||
139,0,21,21,100,280013921,224021404
|
||||
139,0,22,101,200,280013922,224021404
|
||||
139,0,23,201,300,280013923,224021404
|
||||
139,0,24,301,500,280013924,224021404
|
||||
139,0,25,501,1000,280013925,224021404
|
||||
139,0,26,1001,2000,280013926,224021404
|
||||
139,0,27,2001,3000,280013927,224021404
|
||||
139,0,28,3001,4000,280013928,224021404
|
||||
139,0,29,4001,5000,280013929,224021404
|
||||
139,0,30,5001,10000,280013930,224021404
|
||||
139,0,31,10001,20000,280013931,224021404
|
||||
139,0,32,20001,35000,280013932,224021404
|
||||
139,0,33,35001,50000,280013933,224021404
|
||||
139,0,34,50001,100000,280013934,224021404
|
||||
139,0,35,100001,1000000,280013935,224021404
|
||||
991,0,1,1,500,280099101,170
|
||||
991,0,2,501,3000,280099102,170
|
||||
991,0,3,3001,10000,280099103,170
|
||||
991,0,4,10001,20000,280099104,170
|
||||
991,0,5,20001,50000,280099105,170
|
||||
991,0,6,50001,100000,280099106,170
|
||||
991,0,7,100001,150000,280099107,170
|
||||
991,0,8,150001,250000,280099108,170
|
||||
991,0,9,250001,500000,280099109,170
|
||||
991,0,10,500001,1000000,280099110,170
|
||||
992,0,1,1,500,280099201,171
|
||||
992,0,2,501,3000,280099202,171
|
||||
992,0,3,3001,10000,280099203,171
|
||||
992,0,4,10001,20000,280099204,171
|
||||
992,0,5,20001,50000,280099205,171
|
||||
992,0,6,50001,100000,280099206,171
|
||||
992,0,7,100001,150000,280099207,171
|
||||
992,0,8,150001,250000,280099208,171
|
||||
992,0,9,250001,500000,280099209,171
|
||||
992,0,10,500001,1000000,280099210,171
|
||||
127,0,1,1,1,280012701,223111504
|
||||
127,0,2,2,2,280012702,223111504
|
||||
127,0,3,3,3,280012703,223111504
|
||||
127,0,4,4,10,280012704,223111504
|
||||
127,0,5,11,100,280012705,223111504
|
||||
127,0,6,101,200,280012706,223111504
|
||||
127,0,7,201,300,280012707,223111504
|
||||
127,0,8,301,500,280012708,223111504
|
||||
127,0,9,501,1000,280012709,223111504
|
||||
127,0,10,1001,2000,280012710,223111504
|
||||
127,0,11,2001,3000,280012711,223111504
|
||||
127,0,12,3001,4000,280012712,223111504
|
||||
127,0,13,4001,5000,280012713,223111504
|
||||
127,0,14,5001,10000,280012714,223111504
|
||||
127,0,15,10001,20000,280012715,223111504
|
||||
127,0,16,20001,35000,280012716,223111504
|
||||
127,0,17,35001,50000,280012717,223111504
|
||||
127,0,18,50001,100000,280012718,223111504
|
||||
127,0,19,100001,1000000,280012719,223111504
|
||||
|
1882
src/router/databases/csv-en/event_point_ranking_reward.csv
Normal file
1882
src/router/databases/csv-en/event_point_ranking_reward.csv
Normal file
File diff suppressed because it is too large
Load Diff
3456
src/router/databases/csv-en/event_point_reward.csv
Normal file
3456
src/router/databases/csv-en/event_point_reward.csv
Normal file
File diff suppressed because it is too large
Load Diff
37
src/router/databases/csv-en/event_point_settings.csv
Normal file
37
src/router/databases/csv-en/event_point_settings.csv
Normal file
@@ -0,0 +1,37 @@
|
||||
_id,_name,_masterReleaseLabelId
|
||||
101,Miracle Star,223041903
|
||||
102,Miracle Star,223043004
|
||||
103,Icon,223051101
|
||||
104,Miracle Star,223051504
|
||||
105,Icon,223052601
|
||||
106,Miracle Star,223053104
|
||||
107,Icon,223061101
|
||||
109,Miracle Star,223063004
|
||||
110,Icon,223071101
|
||||
112,Icon,223072601
|
||||
113,Miracle Star,223073104
|
||||
114,Icon,223081101
|
||||
116,Icon,223082601
|
||||
117,Miracle Star,223083104
|
||||
118,Icon,223091101
|
||||
120,Icon,223092601
|
||||
121,Miracle Star,223093004
|
||||
122,Icon,223101101
|
||||
123,Miracle Star,223101508
|
||||
124,Icon,223102601
|
||||
125,Miracle Star,223103104
|
||||
126,Icon,223111101
|
||||
127,Star Points,223111504
|
||||
128,Icon,223112601
|
||||
129,Miracle Star,223113004
|
||||
130,Icon,223121102
|
||||
132,Icon,223122603
|
||||
133,Miracle Star,223123104
|
||||
134,Icon,224011106
|
||||
135,Star Points,224011504
|
||||
136,Icon,224012702
|
||||
137,Miracle Star,224013104
|
||||
138,Icon,224021006
|
||||
139,Star Points,224021404
|
||||
140,Icon,224022305
|
||||
141,Miracle Star,224030104
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user