Compare commits

..

8 commits

130 changed files with 788 additions and 49243 deletions

View file

@ -28,22 +28,17 @@ jobs:
run: | run: |
TARGET=$(rustc --version --verbose | grep "host:" | sed -e 's/^host: //') TARGET=$(rustc --version --verbose | grep "host:" | sed -e 's/^host: //')
cd ~ cd ~
curl -SsL -o rustypipe-botguard.tar.xz "https://codeberg.org/ThetaDev/rustypipe-botguard/releases/download/v0.1.1/rustypipe-botguard-v0.1.1-${TARGET}.tar.xz" curl -SsL -o rustypipe-botguard.tar.xz "https://codeberg.org/ThetaDev/rustypipe-botguard/releases/download/v0.1.0/rustypipe-botguard-v0.1.0-${TARGET}.tar.xz"
cd /usr/local/bin cd /usr/local/bin
sudo tar -xJf ~/rustypipe-botguard.tar.xz sudo tar -xJf ~/rustypipe-botguard.tar.xz
rm ~/rustypipe-botguard.tar.xz rm ~/rustypipe-botguard.tar.xz
rustypipe-botguard --version rustypipe-botguard --version
- name: 📎 Clippy - name: 📎 Clippy
run: | run: cargo clippy --all --tests --features=rss,indicatif,audiotag -- -D warnings
cargo clippy --all --tests --features=rss,userdata,indicatif,audiotag -- -D warnings
cargo clippy --package=rustypipe --tests -- -D warnings
cargo clippy --package=rustypipe-downloader -- -D warnings
cargo clippy --package=rustypipe-cli -- -D warnings
cargo clippy --package=rustypipe-cli --features=timezone -- -D warnings
- name: 🧪 Test - name: 🧪 Test
run: cargo nextest run --config-file ~/.config/nextest.toml --profile ci --retries 2 --features rss,userdata --workspace -- --skip 'user_data::' run: cargo nextest run --config-file ~/.config/nextest.toml --profile ci --retries 2 --features rss --workspace -- --skip 'cookie_auth::'
env: env:
ALL_PROXY: "http://warpproxy:8124" ALL_PROXY: "http://warpproxy:8124"

View file

@ -1,69 +0,0 @@
name: Release CLI
on:
push:
tags:
- "rustypipe-cli/v*.*.*"
jobs:
Release:
runs-on: cimaster-latest
steps:
- name: 📦 Checkout repository
uses: actions/checkout@v4
- name: Setup cross compilation
run: |
rustup target add x86_64-pc-windows-msvc x86_64-apple-darwin aarch64-apple-darwin
cargo install cargo-xwin
# https://wapl.es/rust/2019/02/17/rust-cross-compile-linux-to-macos.html/
sudo apt-get install -y llvm clang cmake
cd ~
git clone https://github.com/tpoechtrager/osxcross
cd osxcross
wget -nc "https://github.com/joseluisq/macosx-sdks/releases/download/12.3/MacOSX12.3.sdk.tar.xz"
mv MacOSX12.3.sdk.tar.xz tarballs/
UNATTENDED=yes OSX_VERSION_MIN=12.3 ./build.sh
OSXCROSS_BIN="$(pwd)/target/bin"
echo "CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER=$(find "$OSXCROSS_BIN" -name "x86_64-apple-darwin*-clang")" >> $GITHUB_ENV
echo "CARGO_TARGET_X86_64_APPLE_DARWIN_RUSTFLAGS=-Car=$(find "$OSXCROSS_BIN" -name "x86_64-apple-darwin*-ar"),-Clink-arg=-undefined,-Clink-arg=dynamic_lookup" >> $GITHUB_ENV
echo "CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER=$(find "$OSXCROSS_BIN" -name "aarch64-apple-darwin*-clang")" >> $GITHUB_ENV
echo "CARGO_TARGET_AARCH64_APPLE_DARWIN_RUSTFLAGS=-Car=$(find "$OSXCROSS_BIN" -name "aarch64-apple-darwin*-ar"),-Clink-arg=-undefined,-Clink-arg=dynamic_lookup" >> $GITHUB_ENV
- name: ⚒️ Build application
run: |
export PATH="$PATH:$HOME/osxcross/target/bin"
CRATE="rustypipe-cli"
PKG_CONFIG_SYSROOT_DIR=/usr/x86_64-linux-gnu cargo build --release --package=$CRATE --target x86_64-unknown-linux-gnu
PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu cargo build --release --package=$CRATE --target aarch64-unknown-linux-gnu
CC="$CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER" CXX="$CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER++" cargo build --release --package=$CRATE --target x86_64-apple-darwin
CC="$CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER" CXX="$CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER++" cargo build --release --package=$CRATE --target aarch64-apple-darwin
cargo xwin build --release --package=$CRATE --target x86_64-pc-windows-msvc
- name: Prepare release
run: |
CRATE="rustypipe-cli"
BIN="rustypipe"
echo "CRATE=$CRATE" >> "$GITHUB_ENV"
echo "CRATE_VERSION=$(echo '${{ github.ref_name }}' | awk 'BEGIN{RS="/"} NR==2{print}')" >> "$GITHUB_ENV"
CL_PATH="cli/CHANGELOG.md"
{
echo 'CHANGELOG<<END_OF_FILE'
awk 'BEGIN{RS="(^|\n)## [^\n]+\n*"} NR==2 { print }' "$CL_PATH"
echo END_OF_FILE
} >> "$GITHUB_ENV"
mkdir dist
for arch in x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu x86_64-apple-darwin aarch64-apple-darwin; do
tar -cJf "dist/${BIN}-${CRATE_VERSION}-${arch}.tar.xz" -C target/${arch}/release "${BIN}"
done
(cd target/x86_64-pc-windows-msvc/release && zip -9 "../../../dist/${BIN}-${CRATE_VERSION}-x86_64-pc-windows-msvc.zip" "${BIN}.exe")
- name: 🎉 Publish release
uses: https://gitea.com/actions/release-action@main
with:
title: "${{ env.CRATE }} ${{ env.CRATE_VERSION }}"
body: "${{ env.CHANGELOG }}"
files: dist/*

View file

@ -10,8 +10,4 @@ repos:
hooks: hooks:
- id: cargo-fmt - id: cargo-fmt
- id: cargo-clippy - id: cargo-clippy
name: cargo-clippy rustypipe args: ["--all", "--tests", "--features=rss,indicatif,audiotag", "--", "-D", "warnings"]
args: ["--package=rustypipe", "--tests", "--", "-D", "warnings"]
- id: cargo-clippy
name: cargo-clippy workspace
args: ["--all", "--tests", "--features=rss,userdata,indicatif,audiotag", "--", "-D", "warnings"]

10
.woodpecker.yml Normal file
View file

@ -0,0 +1,10 @@
steps:
test:
image: rust:latest
environment:
- CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
commands:
- rustup component add rustfmt clippy
- cargo fmt --all --check
- cargo clippy --all --features=rss -- -D warnings
- cargo test --features=rss --workspace

View file

@ -3,104 +3,6 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [v0.11.4](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe/v0.11.3..rustypipe/v0.11.4) - 2025-04-23
### 🚀 Features
- Player: handle VPN ban and captcha required error messages - ([be6da5e](https://codeberg.org/ThetaDev/rustypipe/commit/be6da5e7e3558ef39773bf45bcb8afbf006bacec))
### 🐛 Bug Fixes
- Deobfuscator: handle 1-char long global variables, find nsig fn (player 6450230e) - ([d675987](https://codeberg.org/ThetaDev/rustypipe/commit/d675987654972c6aa4cc2b291d25bc49fa60173e))
## [v0.11.3](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe/v0.11.2..rustypipe/v0.11.3) - 2025-04-03
### 🐛 Bug Fixes
- Deobfuscator: global variable extraction fixed - ([ac44e95](https://codeberg.org/ThetaDev/rustypipe/commit/ac44e95a88d95f9d2d1ec672f86ca9d31d6991b9))
- Deobfuscator: small simplification - ([189ba81](https://codeberg.org/ThetaDev/rustypipe/commit/189ba81a42e6c09f6af4d2768c449c22b864101e))
- Deobfuscator: handle global functions as well - ([939a7ae](https://codeberg.org/ThetaDev/rustypipe/commit/939a7aea61a3eee4c1e67bfbfc835f0ce3934171))
- Handle music playlist/album not found - ([ea80717](https://codeberg.org/ThetaDev/rustypipe/commit/ea80717f692b2c45b5063c362c9fa8ebca5a3471))
- Switch client if no adaptive stream URLs were returned - ([187bf1c](https://codeberg.org/ThetaDev/rustypipe/commit/187bf1c9a0e846bff205e0d71a19c5a1ce7b1943))
- Handle music artist not found - ([daf3d03](https://codeberg.org/ThetaDev/rustypipe/commit/daf3d035be38b59aef1ae205ac91c2bbdda2fe66))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rust crate rand to 0.9.0 - ([af415dd](https://codeberg.org/ThetaDev/rustypipe/commit/af415ddf8f94f00edb918f271d8e6336503e9faf))
## [v0.11.2](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe/v0.11.1..rustypipe/v0.11.2) - 2025-03-24
### 🐛 Bug Fixes
- A/B test 22: commandExecutorCommand for playlist continuations - ([e8acbfb](https://codeberg.org/ThetaDev/rustypipe/commit/e8acbfbbcf5d31b5ac34410ddf334e5534e3762f))
- Extract deobf data with global strings variable - ([4ce6746](https://codeberg.org/ThetaDev/rustypipe/commit/4ce6746be538564e79f7e3c67d7a91aaa53f48ea))
- Handle player returning no adaptive stream URLs - ([07db7b1](https://codeberg.org/ThetaDev/rustypipe/commit/07db7b1166e912e1554f98f2ae20c2c356fed38f))
## [v0.11.1](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe/v0.11.0..rustypipe/v0.11.1) - 2025-03-16
### 🐛 Bug Fixes
- Simplify get_player_from_clients logic - ([c04b606](https://codeberg.org/ThetaDev/rustypipe/commit/c04b60604d2628bf8f0e3de453c243adbb966e57))
- Desktop client: generate PO token from user_syncid when authenticated - ([8342cae](https://codeberg.org/ThetaDev/rustypipe/commit/8342caeb0f566a38060a6ec69f3ca65b9a2afcd6))
- Always skip failed clients - ([63a6f50](https://codeberg.org/ThetaDev/rustypipe/commit/63a6f50a8b5ad6bb984282335c1481ae3cd2fe83))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rust crate rstest to 0.25.0 - ([9ed1306](https://codeberg.org/ThetaDev/rustypipe/commit/9ed1306f3aaeb993c409997ddfbc47499e4f4d22))
## [v0.11.0](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe/v0.10.0..rustypipe/v0.11.0) - 2025-02-26
### 🚀 Features
- Add original album track count, fix fetching albums with more than 200 tracks - ([544782f](https://codeberg.org/ThetaDev/rustypipe/commit/544782f8de728cda0aca9a1cb95837cdfbd001f1))
### 🐛 Bug Fixes
- A/B test 21: music album recommendations - ([6737512](https://codeberg.org/ThetaDev/rustypipe/commit/6737512f5f67c8cd05d4552dd0e0f24381035b35))
## [v0.10.0](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe/v0.9.0..rustypipe/v0.10.0) - 2025-02-09
### 🚀 Features
- Add visitor data cache, remove random visitor data - ([b12f4c5](https://codeberg.org/ThetaDev/rustypipe/commit/b12f4c5d821a9189d7ed8410ad860824b6d052ef))
- Add support for rustypipe-botguard to get PO tokens - ([b90a252](https://codeberg.org/ThetaDev/rustypipe/commit/b90a252a5e1bf05a5294168b0ec16a73cbb88f42))
- Add session po token cache - ([b72b501](https://codeberg.org/ThetaDev/rustypipe/commit/b72b501b6dbcf4333b24cd80e7c8c61b0c21ec91))
- Check rustypipe-botguard-api version - ([8385b87](https://codeberg.org/ThetaDev/rustypipe/commit/8385b87c63677f32a240679a78702f53072e517a))
- Rewrite request attempt system, retry with different visitor data - ([dfd03ed](https://codeberg.org/ThetaDev/rustypipe/commit/dfd03edfadff2657e9cfbf04e5d313ba409520ac))
- Log failed player fetch attempts with player_from_clients - ([8e35358](https://codeberg.org/ThetaDev/rustypipe/commit/8e35358c8941301f6ebf7646a11ab22711082569))
- Add timezone query option - ([3a2370b](https://codeberg.org/ThetaDev/rustypipe/commit/3a2370b97ca3d0f40d72d66a23295557317d29fb))
- [**breaking**] Add userdata feature for all personal data queries (playback history, subscriptions) - ([65cb424](https://codeberg.org/ThetaDev/rustypipe/commit/65cb4244c6ab547f53d0cb12af802c4189188c86))
- Add RustyPipe::version_botguard fn, detect rustypipe-botguard in current dir, add botguard version to report - ([1d755b7](https://codeberg.org/ThetaDev/rustypipe/commit/1d755b76bf4569f7d0bb90a65494ac8e7aae499a))
### 🐛 Bug Fixes
- Parsing history dates - ([af7dc10](https://codeberg.org/ThetaDev/rustypipe/commit/af7dc1016322a87dd8fec0b739939c2b12b6f400))
- A/V streams incorrectly recognized as video-only - ([2b891ca](https://codeberg.org/ThetaDev/rustypipe/commit/2b891ca0788f91f16dbb9203191cb3d2092ecc74))
- Update iOS client - ([e915416](https://codeberg.org/ThetaDev/rustypipe/commit/e91541629d6c944c1001f5883e3c1264aeeb3969))
- A/B test 20: music continuation item renderer - ([9c67f8f](https://codeberg.org/ThetaDev/rustypipe/commit/9c67f8f85bef8214848dc9d17bff6cff252e015e))
- Include whole request body in report - ([15245c1](https://codeberg.org/ThetaDev/rustypipe/commit/15245c18b584e42523762b94fcc7284d483660a0))
- Extracting nsig fn when outside variable starts with $ - ([eda16e3](https://codeberg.org/ThetaDev/rustypipe/commit/eda16e378730a3b57c4982a626df1622a93c574a))
- Retry updating deobf data after a RustyPipe update - ([50ab1f7](https://codeberg.org/ThetaDev/rustypipe/commit/50ab1f7a5d8aeaa3720264b4a4b27805bb0e8121))
- Allow player data to be fetched without botguard - ([29c854b](https://codeberg.org/ThetaDev/rustypipe/commit/29c854b20d7a6677415b1744e7ba7ecd4f594ea5))
- Output full request body in reports, clean up `get_player_po_token` - ([a0d850f](https://codeberg.org/ThetaDev/rustypipe/commit/a0d850f8e01428a73bbd66397d0dbf797b45958f))
- Correct timezone offset for parsed dates, add timezone_local option - ([a5a7be5](https://codeberg.org/ThetaDev/rustypipe/commit/a5a7be5b4e0a0b73d7e1dc802ebd7bd48dafc76d))
- Use localzone crate to get local tz - ([5acbf0e](https://codeberg.org/ThetaDev/rustypipe/commit/5acbf0e456b1f10707e0a56125d993a8129eee3a))
- Only use cached potokens with min. 10min lifetime - ([0c94267](https://codeberg.org/ThetaDev/rustypipe/commit/0c94267d0371b2b26c7b5c9abfa156d5cde2153e))
### 📚 Documentation
- Add Botguard info to README - ([9957add](https://codeberg.org/ThetaDev/rustypipe/commit/9957add2b5d6391b2c1869d2019fd7dd91b8cd41))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rust crate rquickjs to 0.9.0 (#33) - ([2c8ac41](https://codeberg.org/ThetaDev/rustypipe/commit/2c8ac410aa535d83f8bcc7181f81914b13bceb77))
## [v0.9.0](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe/v0.8.0..rustypipe/v0.9.0) - 2025-01-16 ## [v0.9.0](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe/v0.8.0..rustypipe/v0.9.0) - 2025-01-16
### 🚀 Features ### 🚀 Features

View file

@ -1,6 +1,6 @@
[package] [package]
name = "rustypipe" name = "rustypipe"
version = "0.11.4" version = "0.9.0"
rust-version = "1.67.1" rust-version = "1.67.1"
edition.workspace = true edition.workspace = true
authors.workspace = true authors.workspace = true
@ -40,7 +40,7 @@ serde_with = { version = "3.0.0", default-features = false, features = [
] } ] }
serde_plain = "1.0.0" serde_plain = "1.0.0"
sha1 = "0.10.0" sha1 = "0.10.0"
rand = "0.9.0" rand = "0.8.0"
time = { version = "0.3.37", features = [ time = { version = "0.3.37", features = [
"macros", "macros",
"serde-human-readable", "serde-human-readable",
@ -67,15 +67,15 @@ dirs = "6.0.0"
filenamify = "0.1.0" filenamify = "0.1.0"
# Testing # Testing
rstest = "0.25.0" rstest = "0.24.0"
tokio-test = "0.4.2" tokio-test = "0.4.2"
insta = { version = "1.17.1", features = ["ron", "redactions"] } insta = { version = "1.17.1", features = ["ron", "redactions"] }
path_macro = "1.0.0" path_macro = "1.0.0"
tracing-test = "0.2.5" tracing-test = "0.2.5"
# Included crates # Included crates
rustypipe = { path = ".", version = "0.11.4", default-features = false } rustypipe = { path = ".", version = "0.9.0", default-features = false }
rustypipe-downloader = { path = "./downloader", version = "0.3.1", default-features = false, features = [ rustypipe-downloader = { path = "./downloader", version = "0.2.1", default-features = false, features = [
"indicatif", "indicatif",
"audiotag", "audiotag",
] } ] }
@ -84,7 +84,6 @@ rustypipe-downloader = { path = "./downloader", version = "0.3.1", default-featu
default = ["default-tls"] default = ["default-tls"]
rss = ["dep:quick-xml"] rss = ["dep:quick-xml"]
userdata = []
# Reqwest TLS options # Reqwest TLS options
default-tls = ["reqwest/default-tls"] default-tls = ["reqwest/default-tls"]
@ -127,6 +126,6 @@ tracing-test.workspace = true
[package.metadata.docs.rs] [package.metadata.docs.rs]
# To build locally: # To build locally:
# RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --features rss,userdata --no-deps --open # RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --features rss --no-deps --open
features = ["rss", "userdata"] features = ["rss"]
rustdoc-args = ["--cfg", "docsrs"] rustdoc-args = ["--cfg", "docsrs"]

View file

@ -1,19 +1,19 @@
test: test:
# cargo test --features=rss,userdata # cargo test --features=rss
cargo nextest run --workspace --features=rss,userdata --no-fail-fast --retries 1 -- --skip 'user_data::' cargo nextest run --workspace --features=rss --no-fail-fast --retries 1 -- --skip 'cookie_auth::'
unittest: unittest:
cargo nextest run --features=rss,userdata --no-fail-fast --lib cargo nextest run --features=rss --no-fail-fast --lib
testyt: testyt:
cargo nextest run --features=rss,userdata --no-fail-fast --retries 1 --test youtube -- --skip 'user_data::' cargo nextest run --features=rss --no-fail-fast --retries 1 --test youtube -- --skip 'cookie_auth::'
testyt-cookie: testyt-cookie:
cargo nextest run --features=rss,userdata --no-fail-fast --retries 1 --test youtube cargo nextest run --features=rss --no-fail-fast --retries 1 --test youtube
testyt-localized: testyt-localized:
YT_LANG=th cargo nextest run --features=rss,userdata --no-fail-fast --retries 1 --test youtube -- \ YT_LANG=th cargo nextest run --features=rss --no-fail-fast --retries 1 --test youtube -- \
--skip 'user_data::' --skip 'search_suggestion' --skip 'isrc_search_languages' --skip 'cookie_auth::' --skip 'search_suggestion' --skip 'isrc_search_languages'
testintl: testintl:
#!/usr/bin/env bash #!/usr/bin/env bash
@ -33,7 +33,7 @@ testintl:
echo "---TESTS FOR $YT_LANG ---" echo "---TESTS FOR $YT_LANG ---"
if YT_LANG="$YT_LANG" cargo nextest run --no-fail-fast --retries 1 --test-threads 4 --test youtube -- \ if YT_LANG="$YT_LANG" cargo nextest run --no-fail-fast --retries 1 --test-threads 4 --test youtube -- \
--skip 'user_data::' --skip 'search_suggestion' --skip 'isrc_search_languages' --skip 'resolve_'; then --skip 'cookie_auth::' --skip 'search_suggestion' --skip 'isrc_search_languages' --skip 'resolve_'; then
echo "--- $YT_LANG COMPLETED ---" echo "--- $YT_LANG COMPLETED ---"
else else
echo "--- $YT_LANG FAILED ---" echo "--- $YT_LANG FAILED ---"

View file

@ -181,19 +181,6 @@ Subscribers: 1780000
... ...
``` ```
## Crate features
Some features of RustyPipe are gated behind features to avoid compiling unneeded
dependencies.
- `rss` Fetch a channel's RSS feed, which is faster than fetching the channel page
- `userdata` Add functions to fetch YouTube user data (watch history, subscriptions,
music library)
You can also choose the TLS library used for making web requests using the same features
as the reqwest crate (`default-tls`, `native-tls`, `native-tls-alpn`,
`native-tls-vendored`, `rustls-tls-webpki-roots`, `rustls-tls-native-roots`).
## Cache storage ## Cache storage
The RustyPipe cache holds the current version numbers for all clients, the JavaScript The RustyPipe cache holds the current version numbers for all clients, the JavaScript
@ -226,21 +213,6 @@ RustyPipe reports come in 3 severity levels:
incomplete) incomplete)
- ERR (entire response could not be deserialized/parsed, RustyPipe returned an error) - ERR (entire response could not be deserialized/parsed, RustyPipe returned an error)
## PO tokens
Since August 2024 YouTube requires PO tokens to access streams from web-based clients
(Desktop, Mobile). Otherwise streams will return a 403 error.
Generating PO tokens requires a simulated browser environment, which would be too large
to include in RustyPipe directly.
Therefore, the PO token generation is handled by a seperate CLI application
([rustypipe-botguard](https://codeberg.org/ThetaDev/rustypipe-botguard)) which is called
by the RustyPipe crate. RustyPipe automatically detects the rustypipe-botguard binary if
it is located in PATH or the current working directory. If your rustypipe-botguard
binary is located at a different path, you can specify it with the `.botguard_bin(path)`
option.
## Authentication ## Authentication
RustyPipe supports authenticating with your YouTube account to access RustyPipe supports authenticating with your YouTube account to access

BIN
bg_snapshot.bin Normal file

Binary file not shown.

View file

@ -3,52 +3,6 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [v0.7.2](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-cli/v0.7.1..rustypipe-cli/v0.7.2) - 2025-03-16
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rustypipe to 0.11.1
- *(deps)* Update rustypipe-downloader to 0.3.1
- *(deps)* Update rust crate rstest to 0.25.0 - ([9ed1306](https://codeberg.org/ThetaDev/rustypipe/commit/9ed1306f3aaeb993c409997ddfbc47499e4f4d22))
## [v0.7.1](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-cli/v0.7.0..rustypipe-cli/v0.7.1) - 2025-02-26
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rustypipe to 0.11.0 - ([035c07f](https://codeberg.org/ThetaDev/rustypipe/commit/035c07f170aa293bcc626f27998c2b2b28660881))
## [v0.7.0](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-cli/v0.6.0..rustypipe-cli/v0.7.0) - 2025-02-09
### 🚀 Features
- Add support for rustypipe-botguard to get PO tokens - ([b90a252](https://codeberg.org/ThetaDev/rustypipe/commit/b90a252a5e1bf05a5294168b0ec16a73cbb88f42))
- [**breaking**] Remove manual PO token options from downloader/cli, add new rustypipe-botguard options - ([cddb32f](https://codeberg.org/ThetaDev/rustypipe/commit/cddb32f190276265258c6ab45b3d43a8891c4b39))
- Add session po token cache - ([b72b501](https://codeberg.org/ThetaDev/rustypipe/commit/b72b501b6dbcf4333b24cd80e7c8c61b0c21ec91))
- Add timezone query option - ([3a2370b](https://codeberg.org/ThetaDev/rustypipe/commit/3a2370b97ca3d0f40d72d66a23295557317d29fb))
- Add --timezone-local CLI option - ([4f2bb47](https://codeberg.org/ThetaDev/rustypipe/commit/4f2bb47ab42ae0c68a64f3b3c2831fa7850b6f56))
- Add verbose flag - ([629b590](https://codeberg.org/ThetaDev/rustypipe/commit/629b5905da653c6fe0f3c6b5814dd2f49030e7ed))
### 🐛 Bug Fixes
- Parsing mixed-case language codes like zh-CN - ([9c73ed4](https://codeberg.org/ThetaDev/rustypipe/commit/9c73ed4b3008cb093c0fa7fd94fd9f1ba8cd3627))
### 🚜 Refactor
- [**breaking**] Add client_type field to DownloadError, rename cli option po-token-cache to pot-cache - ([594e675](https://codeberg.org/ThetaDev/rustypipe/commit/594e675b39efc5fbcdbd5e920a4d2cdee64f718e))
- Rename rustypipe-cli binary to rustypipe - ([c1a872e](https://codeberg.org/ThetaDev/rustypipe/commit/c1a872e1c14ea0956053bd7c65f6875b1cb3bc55))
### 📚 Documentation
- Add Botguard info to README - ([9957add](https://codeberg.org/ThetaDev/rustypipe/commit/9957add2b5d6391b2c1869d2019fd7dd91b8cd41))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rustypipe to 0.10.0
- *(deps)* Update rust crate rquickjs to 0.9.0 (#33) - ([2c8ac41](https://codeberg.org/ThetaDev/rustypipe/commit/2c8ac410aa535d83f8bcc7181f81914b13bceb77))
## [v0.6.0](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-cli/v0.5.0..rustypipe-cli/v0.6.0) - 2025-01-16 ## [v0.6.0](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-cli/v0.5.0..rustypipe-cli/v0.6.0) - 2025-01-16
### 🚀 Features ### 🚀 Features

View file

@ -1,6 +1,6 @@
[package] [package]
name = "rustypipe-cli" name = "rustypipe-cli"
version = "0.7.2" version = "0.6.0"
rust-version = "1.70.0" rust-version = "1.70.0"
edition.workspace = true edition.workspace = true
authors.workspace = true authors.workspace = true
@ -42,7 +42,7 @@ rustls-tls-native-roots = [
] ]
[dependencies] [dependencies]
rustypipe = { workspace = true, features = ["rss", "userdata"] } rustypipe = { workspace = true, features = ["rss"] }
rustypipe-downloader.workspace = true rustypipe-downloader.workspace = true
reqwest.workspace = true reqwest.workspace = true
tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
@ -64,7 +64,3 @@ dirs.workspace = true
anstream = "0.6.15" anstream = "0.6.15"
owo-colors = "4.0.0" owo-colors = "4.0.0"
const_format = "0.2.33" const_format = "0.2.33"
[[bin]]
name = "rustypipe"
path = "src/main.rs"

View file

@ -8,19 +8,7 @@ The RustyPipe CLI is a powerful YouTube client for the command line. It allows y
access most of the features of the RustyPipe crate: getting data from YouTube and access most of the features of the RustyPipe crate: getting data from YouTube and
downloading videos. downloading videos.
## Installation The following subcommands are included:
You can download a compiled version of RustyPipe here:
<https://codeberg.org/ThetaDev/rustypipe/releases>
Alternatively, you can compile it yourself by installing [Rust](https://rustup.rs/) and
running `cargo install rustypipe-cli`.
To be able to access streams from web-based clients (Desktop, Mobile) you need to
download [rustypipe-botguard](https://codeberg.org/ThetaDev/rustypipe-botguard/releases)
and place the binary either in the PATH or the current working directory.
For downloading videos you also need to have ffmpeg installed.
## `get`: Fetch information ## `get`: Fetch information
@ -139,8 +127,8 @@ Fetch a list of all the items saved in your YouTube/YouTube Music profile.
- **Proxy:** RustyPipe respects the environment variables `HTTP_PROXY`, `HTTPS_PROXY` - **Proxy:** RustyPipe respects the environment variables `HTTP_PROXY`, `HTTPS_PROXY`
and `ALL_PROXY` and `ALL_PROXY`
- **Logging:** Enable debug logging with the `-v` (verbose) flag. If you want more - **Logging:** You can change the log level with the `RUST_LOG` environment variable, it
fine-grained control, use the `RUST_LOG` environment variable. is set to `info` by default
- **Visitor data:** A custom visitor data ID can be used with the `--vdata` flag - **Visitor data:** A custom visitor data ID can be used with the `--vdata` flag
- **Authentication:** Use the commands `rustypipe login` and `rustypipe login --cookie` - **Authentication:** Use the commands `rustypipe login` and `rustypipe login --cookie`
to log into your Google account using either OAuth or YouTube cookies. With the to log into your Google account using either OAuth or YouTube cookies. With the
@ -152,7 +140,6 @@ Fetch a list of all the items saved in your YouTube/YouTube Music profile.
Europe/Berlin, Australia/Sydney) Europe/Berlin, Australia/Sydney)
**Note:** this requires building rustypipe-cli with the `timezone` feature **Note:** this requires building rustypipe-cli with the `timezone` feature
- `--local-tz` Use the local timezone instead of UTC - `--local-tz` Use the local timezone instead of UTC
- `--report` Generate a report on every request and store it in a `rustypipe_reports` - `--report` Generate a report on every request and store it in a `rustypipe_reports`
folder in the current directory folder in the current directory

View file

@ -80,9 +80,6 @@ struct Cli {
/// Enable caching for session-bound PO tokens /// Enable caching for session-bound PO tokens
#[clap(long, global = true)] #[clap(long, global = true)]
pot_cache: bool, pot_cache: bool,
/// Enable debug logging
#[clap(short, long, global = true)]
verbose: bool,
} }
#[derive(Parser)] #[derive(Parser)]
@ -881,15 +878,12 @@ async fn run() -> anyhow::Result<()> {
let cli = Cli::parse(); let cli = Cli::parse();
let multi = MultiProgress::new(); let multi = MultiProgress::new();
let mut env_filter = EnvFilter::builder()
.with_default_directive(LevelFilter::INFO.into())
.from_env_lossy();
if cli.verbose {
env_filter = env_filter.add_directive("rustypipe=debug".parse().unwrap());
}
tracing_subscriber::fmt::SubscriberBuilder::default() tracing_subscriber::fmt::SubscriberBuilder::default()
.with_env_filter(env_filter) .with_env_filter(
EnvFilter::builder()
.with_default_directive(LevelFilter::INFO.into())
.from_env_lossy(),
)
.with_writer(ProgWriter(multi.clone())) .with_writer(ProgWriter(multi.clone()))
.init(); .init();

View file

@ -9,7 +9,7 @@ repository.workspace = true
publish = false publish = false
[dependencies] [dependencies]
rustypipe = { path = "../", features = ["userdata"] } rustypipe = { path = "../" }
reqwest.workspace = true reqwest.workspace = true
tokio = { workspace = true, features = ["rt-multi-thread"] } tokio = { workspace = true, features = ["rt-multi-thread"] }
futures-util.workspace = true futures-util.workspace = true

View file

@ -40,15 +40,12 @@ pub enum ABTest {
MusicPlaylistFacepile = 18, MusicPlaylistFacepile = 18,
MusicAlbumGroupsReordered = 19, MusicAlbumGroupsReordered = 19,
MusicContinuationItemRenderer = 20, MusicContinuationItemRenderer = 20,
AlbumRecommends = 21,
CommandExecutorCommand = 22,
} }
/// List of active A/B tests that are run when none is manually specified /// List of active A/B tests that are run when none is manually specified
const TESTS_TO_RUN: &[ABTest] = &[ const TESTS_TO_RUN: &[ABTest] = &[
ABTest::MusicAlbumGroupsReordered, ABTest::MusicAlbumGroupsReordered,
ABTest::AlbumRecommends, ABTest::MusicContinuationItemRenderer,
ABTest::CommandExecutorCommand,
]; ];
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
@ -124,8 +121,6 @@ pub async fn run_test(
ABTest::MusicContinuationItemRenderer => { ABTest::MusicContinuationItemRenderer => {
music_continuation_item_renderer(&query).await music_continuation_item_renderer(&query).await
} }
ABTest::AlbumRecommends => album_recommends(&query).await,
ABTest::CommandExecutorCommand => command_executor_command(&query).await,
} }
.unwrap(); .unwrap();
pb.inc(1); pb.inc(1);
@ -448,33 +443,3 @@ pub async fn music_continuation_item_renderer(rp: &RustyPipeQuery) -> Result<boo
.await?; .await?;
Ok(res.contains("\"continuationItemRenderer\"")) Ok(res.contains("\"continuationItemRenderer\""))
} }
pub async fn album_recommends(rp: &RustyPipeQuery) -> Result<bool> {
let id = "MPREb_u1I69lSAe5v";
let res = rp
.raw(
ClientType::DesktopMusic,
"browse",
&QBrowse {
browse_id: id,
params: None,
},
)
.await?;
Ok(res.contains("\"musicCarouselShelfRenderer\""))
}
pub async fn command_executor_command(rp: &RustyPipeQuery) -> Result<bool> {
let id = "VLPLbZIPy20-1pN7mqjckepWF78ndb6ci_qi";
let res = rp
.raw(
ClientType::Desktop,
"browse",
&QBrowse {
browse_id: id,
params: None,
},
)
.await?;
Ok(res.contains("\"commandExecutorCommand\""))
}

View file

@ -1,130 +0,0 @@
use std::{collections::BTreeMap, fs::File, io::BufReader};
use path_macro::path;
use rustypipe::{
client::{ClientType, RustyPipe},
param::{Language, LANGUAGES},
};
use serde::Deserialize;
use serde_with::rust::deserialize_ignore_any;
use crate::{
model::{QBrowse, SectionList, TextRuns},
util::{self, DICT_DIR},
};
pub async fn collect_album_versions_titles() {
let json_path = path!(*DICT_DIR / "other_versions_titles.json");
let mut res = BTreeMap::new();
let rp = RustyPipe::new();
for lang in LANGUAGES {
let query = QBrowse {
browse_id: "MPREb_nlBWQROfvjo",
params: None,
};
let raw_resp = rp
.query()
.lang(lang)
.raw(ClientType::DesktopMusic, "browse", &query)
.await
.unwrap();
let data = serde_json::from_str::<AlbumData>(&raw_resp).unwrap();
let title = data
.contents
.two_column_browse_results_renderer
.secondary_contents
.section_list_renderer
.contents
.into_iter()
.find_map(|x| match x {
ItemSection::MusicCarouselShelfRenderer(music_carousel_shelf) => {
Some(music_carousel_shelf)
}
ItemSection::None => None,
})
.expect("other versions")
.header
.expect("header")
.music_carousel_shelf_basic_header_renderer
.title
.runs
.into_iter()
.next()
.unwrap()
.text;
println!("{lang}: {title}");
res.insert(lang, title);
}
let file = File::create(json_path).unwrap();
serde_json::to_writer_pretty(file, &res).unwrap();
}
pub fn write_samples_to_dict() {
let json_path = path!(*DICT_DIR / "other_versions_titles.json");
let json_file = File::open(json_path).unwrap();
let collected: BTreeMap<Language, String> =
serde_json::from_reader(BufReader::new(json_file)).unwrap();
let mut dict = util::read_dict();
let langs = dict.keys().copied().collect::<Vec<_>>();
for lang in langs {
let dict_entry = dict.entry(lang).or_default();
let e = collected.get(&lang).unwrap();
assert_eq!(e, e.trim());
dict_entry.album_versions_title = e.to_owned();
for lang in &dict_entry.equivalent {
let ee = collected.get(lang).unwrap();
if ee != e {
panic!("equivalent lang conflict, lang: {lang}");
}
}
}
util::write_dict(dict);
}
#[derive(Debug, Deserialize)]
struct AlbumData {
contents: AlbumDataContents,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct AlbumDataContents {
two_column_browse_results_renderer: X1,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct X1 {
secondary_contents: SectionList<ItemSection>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
enum ItemSection {
MusicCarouselShelfRenderer(MusicCarouselShelf),
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}
#[derive(Debug, Deserialize)]
struct MusicCarouselShelf {
header: Option<MusicCarouselShelfHeader>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct MusicCarouselShelfHeader {
music_carousel_shelf_basic_header_renderer: MusicCarouselShelfHeaderRenderer,
}
#[derive(Debug, Deserialize)]
struct MusicCarouselShelfHeaderRenderer {
title: TextRuns,
}

View file

@ -204,6 +204,8 @@ pub fn parse_video_durations() {
parse(&mut words, lang, dict_entry.by_char, txt, *d); parse(&mut words, lang, dict_entry.by_char, txt, *d);
} }
// dbg!(&words);
for (k, v) in words { for (k, v) in words {
if let Some(v) = v { if let Some(v) = v {
dict_entry.timeago_tokens.insert(k, v.to_string()); dict_entry.timeago_tokens.insert(k, v.to_string());

View file

@ -39,6 +39,9 @@ pub async fn download_testfiles() {
search_playlists().await; search_playlists().await;
search_empty().await; search_empty().await;
trending().await; trending().await;
history().await;
subscriptions().await;
subscription_feed().await;
music_playlist().await; music_playlist().await;
music_playlist_cont().await; music_playlist_cont().await;
@ -62,12 +65,6 @@ pub async fn download_testfiles() {
music_charts().await; music_charts().await;
music_genres().await; music_genres().await;
music_genre().await; music_genre().await;
// User data
history().await;
subscriptions().await;
subscription_feed().await;
music_history().await; music_history().await;
music_saved_artists().await; music_saved_artists().await;
music_saved_albums().await; music_saved_albums().await;
@ -467,7 +464,7 @@ async fn trending() {
} }
async fn history() { async fn history() {
let json_path = path!(*TESTFILES_DIR / "userdata" / "history.json"); let json_path = path!(*TESTFILES_DIR / "history" / "history.json");
if json_path.exists() { if json_path.exists() {
return; return;
} }
@ -477,7 +474,7 @@ async fn history() {
} }
async fn subscriptions() { async fn subscriptions() {
let json_path = path!(*TESTFILES_DIR / "userdata" / "subscriptions.json"); let json_path = path!(*TESTFILES_DIR / "history" / "subscriptions.json");
if json_path.exists() { if json_path.exists() {
return; return;
} }
@ -487,7 +484,7 @@ async fn subscriptions() {
} }
async fn subscription_feed() { async fn subscription_feed() {
let json_path = path!(*TESTFILES_DIR / "userdata" / "subscription_feed.json"); let json_path = path!(*TESTFILES_DIR / "history" / "subscription_feed.json");
if json_path.exists() { if json_path.exists() {
return; return;
} }
@ -819,7 +816,7 @@ async fn music_genre() {
} }
async fn music_history() { async fn music_history() {
let json_path = path!(*TESTFILES_DIR / "music_userdata" / "music_history.json"); let json_path = path!(*TESTFILES_DIR / "music_history" / "music_history.json");
if json_path.exists() { if json_path.exists() {
return; return;
} }
@ -829,7 +826,7 @@ async fn music_history() {
} }
async fn music_saved_artists() { async fn music_saved_artists() {
let json_path = path!(*TESTFILES_DIR / "music_userdata" / "saved_artists.json"); let json_path = path!(*TESTFILES_DIR / "music_history" / "saved_artists.json");
if json_path.exists() { if json_path.exists() {
return; return;
} }
@ -839,7 +836,7 @@ async fn music_saved_artists() {
} }
async fn music_saved_albums() { async fn music_saved_albums() {
let json_path = path!(*TESTFILES_DIR / "music_userdata" / "saved_albums.json"); let json_path = path!(*TESTFILES_DIR / "music_history" / "saved_albums.json");
if json_path.exists() { if json_path.exists() {
return; return;
} }
@ -849,7 +846,7 @@ async fn music_saved_albums() {
} }
async fn music_saved_tracks() { async fn music_saved_tracks() {
let json_path = path!(*TESTFILES_DIR / "music_userdata" / "saved_tracks.json"); let json_path = path!(*TESTFILES_DIR / "music_history" / "saved_tracks.json");
if json_path.exists() { if json_path.exists() {
return; return;
} }
@ -859,7 +856,7 @@ async fn music_saved_tracks() {
} }
async fn music_saved_playlists() { async fn music_saved_playlists() {
let json_path = path!(*TESTFILES_DIR / "music_userdata" / "saved_playlists.json"); let json_path = path!(*TESTFILES_DIR / "music_history" / "saved_playlists.json");
if json_path.exists() { if json_path.exists() {
return; return;
} }

View file

@ -90,8 +90,6 @@ pub(crate) struct Entry {
pub chan_prefix: &'static str, pub chan_prefix: &'static str,
/// Channel name suffix on playlist pages /// Channel name suffix on playlist pages
pub chan_suffix: &'static str, pub chan_suffix: &'static str,
/// "Other versions" title on album pages
pub album_versions_title: &'static str,
} }
"#; "#;
@ -180,8 +178,8 @@ pub(crate) fn entry(lang: Language) -> Entry {
.to_string() .to_string()
.replace('\n', "\n "); .replace('\n', "\n ");
write!(code_timeago_tokens, "{} => Entry {{\n timeago_tokens: {},\n month_before_day: {:?},\n months: {},\n timeago_nd_tokens: {},\n comma_decimal: {:?},\n number_tokens: {},\n number_nd_tokens: {},\n album_types: {},\n chan_prefix: {:?},\n chan_suffix: {:?},\n album_versions_title: {:?},\n }},\n ", write!(code_timeago_tokens, "{} => Entry {{\n timeago_tokens: {},\n month_before_day: {:?},\n months: {},\n timeago_nd_tokens: {},\n comma_decimal: {:?},\n number_tokens: {},\n number_nd_tokens: {},\n album_types: {},\n chan_prefix: {:?},\n chan_suffix: {:?},\n }},\n ",
selector, code_ta_tokens, entry.month_before_day, code_months, code_ta_nd_tokens, entry.comma_decimal, code_number_tokens, code_number_nd_tokens, code_album_types, entry.chan_prefix, entry.chan_suffix, entry.album_versions_title).unwrap(); selector, code_ta_tokens, entry.month_before_day, code_months, code_ta_nd_tokens, entry.comma_decimal, code_number_tokens, code_number_nd_tokens, code_album_types, entry.chan_prefix, entry.chan_suffix).unwrap();
} }
code_timeago_tokens = code_timeago_tokens.trim_end().to_owned() + "\n }\n}\n"; code_timeago_tokens = code_timeago_tokens.trim_end().to_owned() + "\n }\n}\n";

View file

@ -2,7 +2,6 @@
mod abtest; mod abtest;
mod collect_album_types; mod collect_album_types;
mod collect_album_versions_titles;
mod collect_chan_prefixes; mod collect_chan_prefixes;
mod collect_history_dates; mod collect_history_dates;
mod collect_large_numbers; mod collect_large_numbers;
@ -35,14 +34,12 @@ enum Commands {
CollectHistoryDates, CollectHistoryDates,
CollectMusicHistoryDates, CollectMusicHistoryDates,
CollectChanPrefixes, CollectChanPrefixes,
CollectAlbumVersionsTitles,
ParsePlaylistDates, ParsePlaylistDates,
ParseHistoryDates, ParseHistoryDates,
ParseLargeNumbers, ParseLargeNumbers,
ParseAlbumTypes, ParseAlbumTypes,
ParseVideoDurations, ParseVideoDurations,
ParseChanPrefixes, ParseChanPrefixes,
ParseAlbumVersionsTitles,
GenLocales, GenLocales,
GenDict, GenDict,
DownloadTestfiles, DownloadTestfiles,
@ -61,25 +58,28 @@ async fn main() {
match cli.command { match cli.command {
Commands::CollectPlaylistDates => { Commands::CollectPlaylistDates => {
collect_playlist_dates::collect_dates(cli.concurrency).await collect_playlist_dates::collect_dates(cli.concurrency).await;
} }
Commands::CollectLargeNumbers => { Commands::CollectLargeNumbers => {
collect_large_numbers::collect_large_numbers(cli.concurrency).await collect_large_numbers::collect_large_numbers(cli.concurrency).await;
} }
Commands::CollectAlbumTypes => { Commands::CollectAlbumTypes => {
collect_album_types::collect_album_types(cli.concurrency).await collect_album_types::collect_album_types(cli.concurrency).await;
} }
Commands::CollectVideoDurations => { Commands::CollectVideoDurations => {
collect_video_durations::collect_video_durations(cli.concurrency).await collect_video_durations::collect_video_durations(cli.concurrency).await;
} }
Commands::CollectVideoDates => { Commands::CollectVideoDates => {
collect_video_dates::collect_video_dates(cli.concurrency).await collect_video_dates::collect_video_dates(cli.concurrency).await;
} }
Commands::CollectHistoryDates => collect_history_dates::collect_dates().await, Commands::CollectHistoryDates => {
Commands::CollectMusicHistoryDates => collect_history_dates::collect_dates_music().await, collect_history_dates::collect_dates().await;
Commands::CollectChanPrefixes => collect_chan_prefixes::collect_chan_prefixes().await, }
Commands::CollectAlbumVersionsTitles => { Commands::CollectMusicHistoryDates => {
collect_album_versions_titles::collect_album_versions_titles().await collect_history_dates::collect_dates_music().await;
}
Commands::CollectChanPrefixes => {
collect_chan_prefixes::collect_chan_prefixes().await;
} }
Commands::ParsePlaylistDates => collect_playlist_dates::write_samples_to_dict(), Commands::ParsePlaylistDates => collect_playlist_dates::write_samples_to_dict(),
Commands::ParseHistoryDates => collect_history_dates::write_samples_to_dict(), Commands::ParseHistoryDates => collect_history_dates::write_samples_to_dict(),
@ -87,10 +87,9 @@ async fn main() {
Commands::ParseAlbumTypes => collect_album_types::write_samples_to_dict(), Commands::ParseAlbumTypes => collect_album_types::write_samples_to_dict(),
Commands::ParseVideoDurations => collect_video_durations::parse_video_durations(), Commands::ParseVideoDurations => collect_video_durations::parse_video_durations(),
Commands::ParseChanPrefixes => collect_chan_prefixes::write_samples_to_dict(), Commands::ParseChanPrefixes => collect_chan_prefixes::write_samples_to_dict(),
Commands::ParseAlbumVersionsTitles => { Commands::GenLocales => {
collect_album_versions_titles::write_samples_to_dict() gen_locales::generate_locales().await;
} }
Commands::GenLocales => gen_locales::generate_locales().await,
Commands::GenDict => gen_dictionary::generate_dictionary(), Commands::GenDict => gen_dictionary::generate_dictionary(),
Commands::DownloadTestfiles => download_testfiles::download_testfiles().await, Commands::DownloadTestfiles => download_testfiles::download_testfiles().await,
Commands::AbTest { id, n } => { Commands::AbTest { id, n } => {

View file

@ -61,8 +61,6 @@ pub struct DictEntry {
pub chan_prefix: String, pub chan_prefix: String,
/// Channel name suffix on playlist pages /// Channel name suffix on playlist pages
pub chan_suffix: String, pub chan_suffix: String,
/// "Other versions" title on album pages
pub album_versions_title: String,
} }
/// Parsed TimeAgo string, contains amount and time unit. /// Parsed TimeAgo string, contains amount and time unit.

View file

@ -3,37 +3,6 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [v0.3.1](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-downloader/v0.3.0..rustypipe-downloader/v0.3.1) - 2024-12-20
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rustypipe to 0.11.0
## [v0.3.0](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-downloader/v0.2.7..rustypipe-downloader/v0.3.0) - 2025-02-09
### 🚀 Features
- [**breaking**] Remove manual PO token options from downloader in favor of rustypipe-botguard - ([cddb32f](https://codeberg.org/ThetaDev/rustypipe/commit/cddb32f190276265258c6ab45b3d43a8891c4b39))
### 🐛 Bug Fixes
- Ensure downloader futures are send - ([812ff4c](https://codeberg.org/ThetaDev/rustypipe/commit/812ff4c5bafffc5708a6d5066f1ebadb6d9fc958))
- Download audio with dolby codec - ([9234005](https://codeberg.org/ThetaDev/rustypipe/commit/92340056f868007beccb64e9e26eb39abc40f7aa))
### 🚜 Refactor
- [**breaking**] Add client_type field to DownloadError, rename cli option po-token-cache to pot-cache - ([594e675](https://codeberg.org/ThetaDev/rustypipe/commit/594e675b39efc5fbcdbd5e920a4d2cdee64f718e))
### 📚 Documentation
- Add Botguard info to README - ([9957add](https://codeberg.org/ThetaDev/rustypipe/commit/9957add2b5d6391b2c1869d2019fd7dd91b8cd41))
### ⚙️ Miscellaneous Tasks
- *(deps)* Update rustypipe to 0.10.0
## [v0.2.7](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-downloader/v0.2.6..rustypipe-downloader/v0.2.7) - 2025-01-16 ## [v0.2.7](https://codeberg.org/ThetaDev/rustypipe/compare/rustypipe-downloader/v0.2.6..rustypipe-downloader/v0.2.7) - 2025-01-16
### 🚀 Features ### 🚀 Features

View file

@ -1,6 +1,6 @@
[package] [package]
name = "rustypipe-downloader" name = "rustypipe-downloader"
version = "0.3.1" version = "0.2.7"
rust-version = "1.67.1" rust-version = "1.67.1"
edition.workspace = true edition.workspace = true
authors.workspace = true authors.workspace = true
@ -51,7 +51,7 @@ image = { version = "0.25.0", optional = true, default-features = false, feature
"jpeg", "jpeg",
"webp", "webp",
] } ] }
smartcrop2 = { version = "0.4.0", optional = true } smartcrop2 = { version = "0.3.1", optional = true }
[dev-dependencies] [dev-dependencies]
path_macro.workspace = true path_macro.workspace = true

View file

@ -1033,11 +1033,7 @@ impl DownloadQuery {
image::load_from_memory(&img_bts)? image::load_from_memory(&img_bts)?
}; };
let crop = smartcrop::find_best_crop_no_borders( let crop = smartcrop::find_best_crop(&img, NonZeroU32::MIN, NonZeroU32::MIN)
&img,
NonZeroU32::MIN,
NonZeroU32::MIN,
)
.map_err(|e| DownloadError::AudioTag(format!("image crop: {e}").into()))? .map_err(|e| DownloadError::AudioTag(format!("image crop: {e}").into()))?
.crop; .crop;
img = img.crop_imm(crop.x, crop.y, crop.width, crop.height); img = img.crop_imm(crop.x, crop.y, crop.width, crop.height);
@ -1067,8 +1063,8 @@ impl DownloadQuery {
} }
fn get_download_range(offset: u64, size: Option<u64>) -> Range<u64> { fn get_download_range(offset: u64, size: Option<u64>) -> Range<u64> {
let mut rng = rand::rng(); let mut rng = rand::thread_rng();
let chunk_size = rng.random_range(CHUNK_SIZE_MIN..CHUNK_SIZE_MAX); let chunk_size = rng.gen_range(CHUNK_SIZE_MIN..CHUNK_SIZE_MAX);
let mut chunk_end = offset + chunk_size; let mut chunk_end = offset + chunk_size;
if let Some(size) = size { if let Some(size) = size {
@ -1201,8 +1197,6 @@ async fn download_single_file(
} }
} }
tracing::debug!("downloading {} to {}", url, output.to_string_lossy());
let mut file = fs::OpenOptions::new() let mut file = fs::OpenOptions::new()
.append(true) .append(true)
.create(true) .create(true)

View file

@ -3,13 +3,13 @@
When YouTube introduces a new feature, it does so gradually. When a user creates a new When YouTube introduces a new feature, it does so gradually. When a user creates a new
session, YouTube decided randomly which new features should be enabled. session, YouTube decided randomly which new features should be enabled.
YouTube sessions are identified by the visitor data ID. This cookie is sent with every YouTube sessions are identified by the visitor data ID. This cookie is sent with
API request using the `context.client.visitor_data` JSON parameter. It is also returned every API request using the `context.client.visitor_data` JSON parameter. It is also
in the `responseContext.visitorData` response parameter and stored as the `__SECURE-YEC` returned in the `responseContext.visitorData` response parameter and stored as the
cookie. `__SECURE-YEC` cookie.
By sending the same visitor data ID, A/B tests can be reproduced, which is important for By sending the same visitor data ID, A/B tests can be reproduced, which is important
testing alternative YouTube clients. for testing alternative YouTube clients.
This page lists all A/B tests that were encountered while maintaining the RustyPipe This page lists all A/B tests that were encountered while maintaining the RustyPipe
client. client.
@ -1030,7 +1030,7 @@ commandContext missing).
- **Encountered on:** 13.01.2025 - **Encountered on:** 13.01.2025
- **Impact:** 🟢 Low - **Impact:** 🟢 Low
- **Endpoint:** browse (YTM) - **Endpoint:** browse (YTM)
- **Status:** Frequent (59%) - **Status:** Common (10%)
YouTube Music used to group artist albums into 2 rows: "Albums" and "Singles". YouTube Music used to group artist albums into 2 rows: "Albums" and "Singles".
@ -1042,7 +1042,7 @@ omitted for albums in their group, while singles and EPs have a label with their
- **Encountered on:** 25.01.2025 - **Encountered on:** 25.01.2025
- **Impact:** 🟢 Low - **Impact:** 🟢 Low
- **Endpoint:** browse (YTM) - **Endpoint:** browse (YTM)
- **Status:** Stabilized - **Status:** Common (4%)
YouTube Music now uses a `continuationItemRenderer` for music playlists instead of YouTube Music now uses a `continuationItemRenderer` for music playlists instead of
putting the continuations in a separate attribute of the MusicShelf. putting the continuations in a separate attribute of the MusicShelf.
@ -1052,52 +1052,3 @@ items.
YouTube Music now also sends a random 16-character string as a `clientScreenNonce` in YouTube Music now also sends a random 16-character string as a `clientScreenNonce` in
the request context. This is not mandatory though. the request context. This is not mandatory though.
## [21] Music album recommendations
- **Encountered on:** 26.02.2025
- **Impact:** 🟢 Low
- **Endpoint:** browse (YTM)
- **Status:** Common (15%)
![A/B test 21 screenshot](./_img/ab_21.png)
YouTube Music has added "Recommended" and "More from \<Artist\>" carousels to album
pages. The difficulty is distinguishing them reliably for parsing the album variants.
The current solution is adding the "Other versions" title in all languages to the
dictionary and comparing it.
## [22] commandExecutorCommand for continuations
- **Encountered on:** 16.03.2025
- **Impact:** 🟢 Low
- **Endpoint:** browse (YTM)
- **Status:** Experimental (1%)
YouTube playlists may use a commandExecutorCommand which holds a list of commands: the
`continuationCommand` that needs to be extracted as well as a `playlistVotingRefreshPopupCommand`.
```json
{
"continuationItemRenderer": {
"continuationEndpoint": {
"commandExecutorCommand": {
"commands": [
{
"playlistVotingRefreshPopupCommand": {
"command": {}
}
},
{
"continuationCommand": {
"request": "CONTINUATION_REQUEST_TYPE_BROWSE",
"token": "4qmFsgKBARIkVkxQTGJaSVB5MjAtMXBON21xamNrZXBXRjc4bmRiNmNpX3FpGjRDQUY2SGxCVU9rTklTV2xGUkVreVVtdEZOVTVFU1hsU2FrWkRVa1JKZWs1NldRJTNEJTNEmgIiUExiWklQeTIwLTFwTjdtcWpja2VwV0Y3OG5kYjZjaV9xaQ%3D%3D"
}
}
]
}
}
}
}
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

View file

@ -468,9 +468,8 @@ fn map_channel(
let subscriber_count = sub_part.and_then(|t| { let subscriber_count = sub_part.and_then(|t| {
util::parse_large_numstr_or_warn::<u64>(t.as_str(), ctx.lang, &mut warnings) util::parse_large_numstr_or_warn::<u64>(t.as_str(), ctx.lang, &mut warnings)
}); });
let video_count = vc_part.and_then(|t| { let video_count =
util::parse_large_numstr_or_warn(t.as_str(), ctx.lang, &mut warnings) vc_part.and_then(|t| util::parse_numeric_or_warn(t.as_str(), &mut warnings));
});
Channel { Channel {
id: metadata.external_id, id: metadata.external_id,

View file

@ -3,7 +3,7 @@ use std::fmt::Debug;
use crate::{ use crate::{
error::{Error, ExtractionError}, error::{Error, ExtractionError},
model::ChannelRss, model::ChannelRss,
report::Report, report::{Report, RustyPipeInfo},
util, util,
}; };
@ -45,7 +45,7 @@ impl RustyPipeQuery {
Err(e) => { Err(e) => {
if let Some(reporter) = &self.client.inner.reporter { if let Some(reporter) = &self.client.inner.reporter {
let report = Report { let report = Report {
info: self.rp_info(), info: RustyPipeInfo::new(Some(self.opts.lang)),
level: crate::report::Level::ERR, level: crate::report::Level::ERR,
operation: "channel_rss", operation: "channel_rss",
error: Some(e.to_string()), error: Some(e.to_string()),

View file

@ -7,7 +7,7 @@ use crate::{
error::{Error, ExtractionError}, error::{Error, ExtractionError},
model::{ model::{
paginator::{ContinuationEndpoint, Paginator}, paginator::{ContinuationEndpoint, Paginator},
ChannelItem, HistoryItem, Playlist, PlaylistItem, VideoItem, ChannelItem, HistoryItem, PlaylistItem, VideoItem,
}, },
serializer::MapResult, serializer::MapResult,
}; };
@ -148,28 +148,6 @@ impl RustyPipeQuery {
) )
.await .await
} }
/// Get all liked videos of the logged-in user
///
/// Requires authentication cookies.
pub async fn liked_videos(&self) -> Result<Playlist, Error> {
self.clone()
.authenticated()
.playlist("LL")
.await
.map_err(crate::util::map_internal_playlist_err)
}
/// Get the "Watch later" playlist of the logged-in user
///
/// Requires authentication cookies.
pub async fn watch_later(&self) -> Result<Playlist, Error> {
self.clone()
.authenticated()
.playlist("WL")
.await
.map_err(crate::util::map_internal_playlist_err)
}
} }
impl MapResponse<Paginator<HistoryItem<VideoItem>>> for response::History { impl MapResponse<Paginator<HistoryItem<VideoItem>>> for response::History {
@ -207,9 +185,11 @@ impl MapResponse<Paginator<HistoryItem<VideoItem>>> for response::History {
&mut map_res, &mut map_res,
); );
} }
response::YouTubeListItem::ContinuationItemRenderer(ep) => { response::YouTubeListItem::ContinuationItemRenderer {
continuation_endpoint,
} => {
if ctoken.is_none() { if ctoken.is_none() {
ctoken = ep.continuation_endpoint.into_token(); ctoken = Some(continuation_endpoint.continuation_command.token);
} }
} }
_ => {} _ => {}
@ -278,7 +258,7 @@ mod tests {
#[test] #[test]
fn map_history() { fn map_history() {
let json_path = path!(*TESTFILES / "userdata" / "history.json"); let json_path = path!(*TESTFILES / "history" / "history.json");
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();
let history: response::History = let history: response::History =
@ -298,7 +278,7 @@ mod tests {
#[test] #[test]
fn map_subscription_feed() { fn map_subscription_feed() {
let json_path = path!(*TESTFILES / "userdata" / "subscription_feed.json"); let json_path = path!(*TESTFILES / "history" / "subscription_feed.json");
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();
let history: response::History = let history: response::History =

View file

@ -3,10 +3,12 @@
pub(crate) mod response; pub(crate) mod response;
mod channel; mod channel;
mod history;
mod music_artist; mod music_artist;
mod music_charts; mod music_charts;
mod music_details; mod music_details;
mod music_genres; mod music_genres;
mod music_history;
mod music_new; mod music_new;
mod music_playlist; mod music_playlist;
mod music_search; mod music_search;
@ -18,13 +20,6 @@ mod trends;
mod url_resolver; mod url_resolver;
mod video_details; mod video_details;
#[cfg(feature = "userdata")]
#[cfg_attr(docsrs, doc(cfg(feature = "userdata")))]
mod music_userdata;
#[cfg(feature = "userdata")]
#[cfg_attr(docsrs, doc(cfg(feature = "userdata")))]
mod userdata;
#[cfg(feature = "rss")] #[cfg(feature = "rss")]
#[cfg_attr(docsrs, doc(cfg(feature = "rss")))] #[cfg_attr(docsrs, doc(cfg(feature = "rss")))]
mod channel_rss; mod channel_rss;
@ -293,10 +288,8 @@ struct OauthToken {
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
struct AuthCookie { struct AuthCookie {
cookie: String, cookie: String,
#[serde(alias = "account_syncid", skip_serializing_if = "Option::is_none")]
channel_syncid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
user_syncid: Option<String>, account_syncid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
session_index: Option<String>, session_index: Option<String>,
} }
@ -321,9 +314,8 @@ impl AuthCookie {
fn new(cookie: String) -> Self { fn new(cookie: String) -> Self {
Self { Self {
cookie, cookie,
channel_syncid: None, account_syncid: None,
session_index: None, session_index: None,
user_syncid: None,
} }
} }
} }
@ -365,8 +357,6 @@ const OAUTH_CLIENT_ID: &str =
const OAUTH_CLIENT_SECRET: &str = "SboVhoG9s0rNafixCSGGKXAT"; const OAUTH_CLIENT_SECRET: &str = "SboVhoG9s0rNafixCSGGKXAT";
const OAUTH_SCOPES: &str = "http://gdata.youtube.com https://www.googleapis.com/auth/youtube"; const OAUTH_SCOPES: &str = "http://gdata.youtube.com https://www.googleapis.com/auth/youtube";
const BOTGUARD_API_VERSION: &str = "1";
static CLIENT_VERSION_REGEX: Lazy<Regex> = static CLIENT_VERSION_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(r#""INNERTUBE_CONTEXT_CLIENT_VERSION":"([\w\d\._-]+?)""#).unwrap()); Lazy::new(|| Regex::new(r#""INNERTUBE_CONTEXT_CLIENT_VERSION":"([\w\d\._-]+?)""#).unwrap());
@ -384,7 +374,7 @@ struct RustyPipeRef {
http: Client, http: Client,
storage: Option<Box<dyn CacheStorage>>, storage: Option<Box<dyn CacheStorage>>,
reporter: Option<Box<dyn Reporter>>, reporter: Option<Box<dyn Reporter>>,
n_http_retries: u32, n_request_attempts: u32,
cache: CacheHolder, cache: CacheHolder,
default_opts: RustyPipeOpts, default_opts: RustyPipeOpts,
user_agent: Cow<'static, str>, user_agent: Cow<'static, str>,
@ -408,19 +398,17 @@ struct RustyPipeOpts {
pub struct RustyPipeBuilder { pub struct RustyPipeBuilder {
storage: DefaultOpt<Box<dyn CacheStorage>>, storage: DefaultOpt<Box<dyn CacheStorage>>,
reporter: DefaultOpt<Box<dyn Reporter>>, reporter: DefaultOpt<Box<dyn Reporter>>,
n_http_retries: u32, n_request_attempts: u32,
timeout: DefaultOpt<Duration>, timeout: DefaultOpt<Duration>,
user_agent: Option<String>, user_agent: Option<String>,
default_opts: RustyPipeOpts, default_opts: RustyPipeOpts,
storage_dir: Option<PathBuf>, storage_dir: Option<PathBuf>,
botguard_bin: DefaultOpt<OsString>, botguard_bin: DefaultOpt<OsString>,
snapshot_file: Option<PathBuf>,
po_token_cache: bool, po_token_cache: bool,
} }
struct BotguardCfg { struct BotguardCfg {
program: OsString, program: OsString,
version: String,
snapshot_file: PathBuf, snapshot_file: PathBuf,
po_token_cache: bool, po_token_cache: bool,
} }
@ -448,6 +436,13 @@ impl<T> DefaultOpt<T> {
DefaultOpt::Default => Some(f()), DefaultOpt::Default => Some(f()),
} }
} }
fn or_default_opt<F: FnOnce() -> Option<T>>(self, f: F) -> Option<T> {
match self {
DefaultOpt::Some(x) => Some(x),
DefaultOpt::None => None,
DefaultOpt::Default => f(),
}
}
} }
/// # RustyPipe query /// # RustyPipe query
@ -508,26 +503,6 @@ impl<T> DefaultOpt<T> {
/// - [`music_new_albums`](RustyPipeQuery::music_new_albums) /// - [`music_new_albums`](RustyPipeQuery::music_new_albums)
/// - [`music_new_videos`](RustyPipeQuery::music_new_videos) /// - [`music_new_videos`](RustyPipeQuery::music_new_videos)
/// ///
/// ### User data (🔒 Feature `userdata`)
///
/// - **Playback history**
/// - [`history`](RustyPipeQuery::history)
/// - [`history_search`](RustyPipeQuery::history_search)
/// - [`music_history`](RustyPipeQuery::music_history)
/// - **YouTube library**
/// - [`liked_videos`](RustyPipeQuery::liked_videos)
/// - [`watch_later`](RustyPipeQuery::watch_later)
/// - [`saved_playlists`](RustyPipeQuery::saved_playlists)
/// - **Music library**
/// - [`music_saved_artists`](RustyPipeQuery::music_saved_artists)
/// - [`music_saved_albums`](RustyPipeQuery::music_saved_albums)
/// - [`music_saved_tracks`](RustyPipeQuery::music_saved_tracks)
/// - [`music_saved_playlists`](RustyPipeQuery::music_saved_playlists)
/// - [`music_liked_tracks`](RustyPipeQuery::music_liked_tracks)
/// - **Subscriptions**
/// - [`subscriptions`](RustyPipeQuery::subscriptions)
/// - [`subscription_feed`](RustyPipeQuery::subscription_feed)
///
/// ## Options /// ## Options
/// ///
/// You can set the language, country and visitor data ID for individual requests. /// You can set the language, country and visitor data ID for individual requests.
@ -680,11 +655,10 @@ impl RustyPipeBuilder {
storage: DefaultOpt::Default, storage: DefaultOpt::Default,
reporter: DefaultOpt::Default, reporter: DefaultOpt::Default,
timeout: DefaultOpt::Default, timeout: DefaultOpt::Default,
n_http_retries: 2, n_request_attempts: 2,
user_agent: None, user_agent: None,
storage_dir: None, storage_dir: None,
botguard_bin: DefaultOpt::Default, botguard_bin: DefaultOpt::Default,
snapshot_file: None,
po_token_cache: false, po_token_cache: false,
} }
} }
@ -750,31 +724,27 @@ impl RustyPipeBuilder {
let visitor_data_cache = VisitorDataCache::new(http.clone(), 50, 20); let visitor_data_cache = VisitorDataCache::new(http.clone(), 50, 20);
let botguard = match self.botguard_bin { let botguard_bin = self.botguard_bin.or_default_opt(|| {
DefaultOpt::Some(botguard_bin) => Some(detect_botguard_bin(botguard_bin)?), let n = OsString::from("rustypipe-botguard");
DefaultOpt::None => None, let out = std::process::Command::new(&n)
DefaultOpt::Default => detect_botguard_bin("./rustypipe-botguard".into()) .arg("--version")
.or_else(|_| detect_botguard_bin("rustypipe-botguard".into())) .output()
.map_err(|e| tracing::debug!("could not detect rustypipe-botguard: {e}")) .ok()?;
.ok(), if !out.status.success() {
return None;
} }
.map(|(program, version)| { let output = String::from_utf8_lossy(&out.stdout);
tracing::debug!( let pat = "rustypipe-botguard-api ";
"rustypipe-botguard: using {} at {}", let pos = output.find(pat)? + pat.len();
version, let pos_end = output[pos..]
program.to_string_lossy() .char_indices()
); .find(|(_, c)| !c.is_ascii_digit())
.map(|(p, _)| p + pos)
BotguardCfg { .unwrap_or(output.len());
program: program.to_owned(), if &output[pos..pos_end] != "1" {
version, return None;
snapshot_file: self.snapshot_file.unwrap_or_else(|| {
let mut snapshot_file = storage_dir.clone();
snapshot_file.push("bg_snapshot.bin");
snapshot_file
}),
po_token_cache: self.po_token_cache,
} }
Some(n)
}); });
Ok(RustyPipe { Ok(RustyPipe {
@ -782,11 +752,11 @@ impl RustyPipeBuilder {
http, http,
storage, storage,
reporter: self.reporter.or_default(|| { reporter: self.reporter.or_default(|| {
let mut report_dir = storage_dir; let mut report_dir = storage_dir.clone();
report_dir.push(DEFAULT_REPORT_DIR); report_dir.push(DEFAULT_REPORT_DIR);
Box::new(FileReporter::new(report_dir)) Box::new(FileReporter::new(report_dir))
}), }),
n_http_retries: self.n_http_retries, n_request_attempts: self.n_request_attempts,
cache: CacheHolder { cache: CacheHolder {
clients: cache_clients, clients: cache_clients,
deobf: AsyncRwLock::new(cdata.deobf), deobf: AsyncRwLock::new(cdata.deobf),
@ -796,7 +766,15 @@ impl RustyPipeBuilder {
default_opts: self.default_opts, default_opts: self.default_opts,
user_agent, user_agent,
visitor_data_cache, visitor_data_cache,
botguard, botguard: botguard_bin.map(|program| {
let mut snapshot_file = storage_dir;
snapshot_file.push("bg_snapshot.bin");
BotguardCfg {
program,
snapshot_file,
po_token_cache: self.po_token_cache,
}
}),
}), }),
}) })
} }
@ -865,9 +843,9 @@ impl RustyPipeBuilder {
self self
} }
/// Set the maximum number of retries for YouTube requests. /// Set the maximum number of attempts for HTTP requests (at least 1).
/// ///
/// If a request fails because of a serverside error and retries are enabled, /// If a HTTP requests fails because of a serverside error and retries are enabled,
/// RustyPipe waits 1 second before the next attempt. /// RustyPipe waits 1 second before the next attempt.
/// ///
/// The wait time is doubled for subsequent attempts (including a bit of /// The wait time is doubled for subsequent attempts (including a bit of
@ -875,8 +853,8 @@ impl RustyPipeBuilder {
/// ///
/// **Default value**: 2 /// **Default value**: 2
#[must_use] #[must_use]
pub fn n_http_retries(mut self, n_retries: u32) -> Self { pub fn n_request_attempts(mut self, n_retries: u32) -> Self {
self.n_http_retries = n_retries.max(1); self.n_request_attempts = n_retries.max(1);
self self
} }
@ -1032,18 +1010,6 @@ impl RustyPipeBuilder {
self self
} }
/// Set the path where the rustypipe-botguard snapshot file is stored
///
/// After solving a Botguard challenge, rustypipe-botguard stores its
/// JavaScript environment in a snapshot file, so it can quickly generate additional tokens.
///
/// By default the snapshot is stored in the storage_dir (Filename: bg_snapshot.bin).
#[must_use]
pub fn botguard_snapshot_file<P: Into<PathBuf>>(mut self, snapshot_file: P) -> Self {
self.snapshot_file = Some(snapshot_file.into());
self
}
/// Enable caching for session-bound PO tokens /// Enable caching for session-bound PO tokens
/// ///
/// By default, RustyPipe calls Botguard for every player request to fetch both a /// By default, RustyPipe calls Botguard for every player request to fetch both a
@ -1094,7 +1060,7 @@ impl RustyPipe {
/// Execute the given http request. /// Execute the given http request.
async fn http_request(&self, request: &Request) -> Result<Response, reqwest::Error> { async fn http_request(&self, request: &Request) -> Result<Response, reqwest::Error> {
let mut last_resp = None; let mut last_resp = None;
for n in 0..=self.inner.n_http_retries { for n in 0..=self.inner.n_request_attempts {
let resp = self.inner.http.execute(request.try_clone().unwrap()).await; let resp = self.inner.http.execute(request.try_clone().unwrap()).await;
let err = match resp { let err = match resp {
@ -1120,7 +1086,7 @@ impl RustyPipe {
}; };
// Retry in case of a recoverable status code (server err, too many requests) // Retry in case of a recoverable status code (server err, too many requests)
if n != self.inner.n_http_retries { if n != self.inner.n_request_attempts {
let ms = util::retry_delay(n, 1000, 60000, 3); let ms = util::retry_delay(n, 1000, 60000, 3);
tracing::warn!( tracing::warn!(
"Retry attempt #{}. Error: {}. Waiting {} ms", "Retry attempt #{}. Error: {}. Waiting {} ms",
@ -1594,17 +1560,6 @@ impl RustyPipe {
.ok_or(Error::Auth(AuthError::NoLogin)) .ok_or(Error::Auth(AuthError::NoLogin))
} }
fn user_auth_datasync_id(&self) -> Result<String, Error> {
self.inner
.cache
.auth_cookie
.read()
.unwrap()
.as_ref()
.and_then(|c| c.user_syncid.as_ref().map(|id| id.to_owned()))
.ok_or(Error::Auth(AuthError::NoLogin))
}
/// Set the user authentication cookie /// Set the user authentication cookie
/// ///
/// The cookie is used for authenticated requests with browser-based clients /// The cookie is used for authenticated requests with browser-based clients
@ -1699,17 +1654,17 @@ impl RustyPipe {
))?; ))?;
// datasyncid is of the form "channel_syncid||user_syncid" for secondary channel // datasyncid is of the form "channel_syncid||user_syncid" for secondary channel
// and just "user_syncid||" for primary channel. // and just "user_syncid||" for primary channel. We only want the channel_syncid
let (p1, p2) = let (channel_syncid, user_syncid) =
datasync_id datasync_id
.split_once("||") .split_once("||")
.ok_or(Error::Extraction(ExtractionError::InvalidData( .ok_or(Error::Extraction(ExtractionError::InvalidData(
"datasyncId does not contain || seperator".into(), "datasyncId does not contain || seperator".into(),
)))?; )))?;
(auth_cookie.channel_syncid, auth_cookie.user_syncid) = if p2.is_empty() { auth_cookie.account_syncid = if user_syncid.is_empty() {
(None, Some(p1.to_owned())) None
} else { } else {
(Some(p1.to_owned()), Some(p2.to_owned())) Some(channel_syncid.to_owned())
}; };
auth_cookie.session_index = Some( auth_cookie.session_index = Some(
@ -1719,11 +1674,6 @@ impl RustyPipe {
); );
Ok(()) Ok(())
} }
/// Get the version string (e.g. `rustypipe-botguard 0.1.1`) of the used botguard binary
pub async fn version_botguard(&self) -> Option<String> {
self.inner.botguard.as_ref().map(|bg| bg.version.to_owned())
}
} }
impl RustyPipeQuery { impl RustyPipeQuery {
@ -2143,7 +2093,7 @@ impl RustyPipeQuery {
if let Some(session_index) = auth_cookie.session_index { if let Some(session_index) = auth_cookie.session_index {
r = r.header("X-Goog-AuthUser", session_index); r = r.header("X-Goog-AuthUser", session_index);
} }
if let Some(account_syncid) = auth_cookie.channel_syncid { if let Some(account_syncid) = auth_cookie.account_syncid {
r = r.header("X-Goog-PageId", account_syncid); r = r.header("X-Goog-PageId", account_syncid);
} }
cookie = Some(auth_cookie.cookie); cookie = Some(auth_cookie.cookie);
@ -2202,7 +2152,7 @@ impl RustyPipeQuery {
self.client.inner.visitor_data_cache.remove(visitor_data); self.client.inner.visitor_data_cache.remove(visitor_data);
} }
/// Generate PO tokens /// Get PO tokens
async fn get_po_tokens(&self, idents: &[&str]) -> Result<(Vec<String>, OffsetDateTime), Error> { async fn get_po_tokens(&self, idents: &[&str]) -> Result<(Vec<String>, OffsetDateTime), Error> {
let bg = self let bg = self
.client .client
@ -2241,11 +2191,9 @@ impl RustyPipeQuery {
} }
let mut valid_until = None; let mut valid_until = None;
let mut from_snapshot = false;
for word in words { for word in words {
if let Some((k, v)) = word.split_once('=') { if let Some((k, v)) = word.split_once('=') {
match k { if k == "valid_until" {
"valid_until" => {
valid_until = Some( valid_until = Some(
v.parse::<i64>() v.parse::<i64>()
.ok() .ok()
@ -2255,27 +2203,16 @@ impl RustyPipeQuery {
))?, ))?,
); );
} }
"from_snapshot" => {
from_snapshot = v.eq_ignore_ascii_case("true") || v == "1";
}
_ => {}
}
} }
} }
let valid_until = tracing::debug!("generated PO token (took {:?})", start.elapsed());
valid_until.unwrap_or_else(|| OffsetDateTime::now_utc() + time::Duration::hours(12)); Ok((
tokens,
tracing::debug!( valid_until.unwrap_or_else(|| OffsetDateTime::now_utc() + time::Duration::hours(12)),
"generated PO token (valid_until {}, from_snapshot={}, took {}ms)", ))
valid_until,
from_snapshot,
start.elapsed().as_millis()
);
Ok((tokens, valid_until))
} }
/// Get a session-bound PO token (either from cache or newly generated)
async fn get_session_po_token(&self, visitor_data: &str) -> Result<PoToken, Error> { async fn get_session_po_token(&self, visitor_data: &str) -> Result<PoToken, Error> {
if let Some(po_token) = self.client.inner.visitor_data_cache.get_pot(visitor_data) { if let Some(po_token) = self.client.inner.visitor_data_cache.get_pot(visitor_data) {
return Ok(po_token); return Ok(po_token);
@ -2289,7 +2226,7 @@ impl RustyPipeQuery {
Ok(po_token) Ok(po_token)
} }
/// Get a PO token (Proof-of-origin token) /// Get a Proof-of-origin token
/// ///
/// PO tokens are used by the web-based YouTube clients for requesting player data and video streams. /// PO tokens are used by the web-based YouTube clients for requesting player data and video streams.
/// ///
@ -2303,22 +2240,6 @@ impl RustyPipeQuery {
}) })
} }
/// Get a new RustyPipeInfo object for reports
fn rp_info(&self) -> RustyPipeInfo<'_> {
RustyPipeInfo::new(
Some(self.opts.lang),
self.client
.inner
.botguard
.as_ref()
.map(|bg| bg.version.as_str()),
)
}
/// Execute a request to the YouTube API, then deobfuscate and map the response.
///
/// Runs a single attempt, returns Ok with a erroneous RequestResult in case of a
/// HTTP or mapping error so it can be retried/reported.
async fn execute_request_attempt< async fn execute_request_attempt<
R: DeserializeOwned + MapResponse<M> + Debug, R: DeserializeOwned + MapResponse<M> + Debug,
M, M,
@ -2410,10 +2331,6 @@ impl RustyPipeQuery {
}) })
} }
/// Execute a request to the YouTube API, then deobfuscate and map the response.
///
/// Runs up to n_request_attempts, returns Ok with a erroneous RequestResult in case of a
/// HTTP or mapping error so it can be reported.
async fn execute_request_inner< async fn execute_request_inner<
R: DeserializeOwned + MapResponse<M> + Debug, R: DeserializeOwned + MapResponse<M> + Debug,
M, M,
@ -2427,7 +2344,7 @@ impl RustyPipeQuery {
ctx_src: &MapRespOptions<'_>, ctx_src: &MapRespOptions<'_>,
) -> Result<RequestResult<M>, Error> { ) -> Result<RequestResult<M>, Error> {
let mut last_resp = None; let mut last_resp = None;
for n in 0..=self.client.inner.n_http_retries { for n in 0..=self.client.inner.n_request_attempts {
let resp = self let resp = self
.execute_request_attempt::<R, M, B>(ctype, id, endpoint, body, ctx_src) .execute_request_attempt::<R, M, B>(ctype, id, endpoint, body, ctx_src)
.await?; .await?;
@ -2445,7 +2362,7 @@ impl RustyPipeQuery {
// Remove the used visitor data from cache if the request resulted in a recoverable error // Remove the used visitor data from cache if the request resulted in a recoverable error
self.remove_visitor_data(&resp.visitor_data); self.remove_visitor_data(&resp.visitor_data);
if n != self.client.inner.n_http_retries { if n != self.client.inner.n_request_attempts {
let ms = util::retry_delay(n, 1000, 60000, 3); let ms = util::retry_delay(n, 1000, 60000, 3);
tracing::warn!( tracing::warn!(
"Retry attempt #{}. Error: {}. Waiting {} ms", "Retry attempt #{}. Error: {}. Waiting {} ms",
@ -2520,7 +2437,7 @@ impl RustyPipeQuery {
if level > Level::DBG || self.opts.report { if level > Level::DBG || self.opts.report {
if let Some(reporter) = &self.client.inner.reporter { if let Some(reporter) = &self.client.inner.reporter {
let report = Report { let report = Report {
info: self.rp_info(), info: RustyPipeInfo::new(Some(self.opts.lang)),
level, level,
operation: &format!("{operation}({id})"), operation: &format!("{operation}({id})"),
error, error,
@ -2720,46 +2637,6 @@ fn local_tz_offset() -> (String, i16) {
} }
} }
/// Check if a valid Botguard binary is available at the given location
fn detect_botguard_bin(program: OsString) -> Result<(OsString, String), Error> {
let out = std::process::Command::new(&program)
.arg("--version")
.output()
.map_err(|e| {
if e.kind() == std::io::ErrorKind::NotFound {
Error::Other("rustypipe-botguard binary not found".into())
} else {
Error::Other(format!("error calling rustypipe-botguard {e}").into())
}
})?;
if !out.status.success() {
return Err(Error::Extraction(ExtractionError::Botguard(
format!("version check failed with status {}", out.status).into(),
)));
}
let output = String::from_utf8_lossy(&out.stdout);
let pat = "rustypipe-botguard-api ";
let pos = output.find(pat).ok_or(Error::Other(
"no rustypipe-botguard-api version returned".into(),
))? + pat.len();
let pos_end = output[pos..]
.char_indices()
.find(|(_, c)| !c.is_ascii_digit())
.map(|(p, _)| p + pos)
.unwrap_or(output.len());
let api_version = &output[pos..pos_end];
if api_version != BOTGUARD_API_VERSION {
return Err(Error::Other(
format!(
"incompatible rustypipe-botguard-api version {api_version}, expected {BOTGUARD_API_VERSION}"
)
.into(),
));
}
let version = output[..pos].lines().next().unwrap_or_default().to_owned();
Ok((program, version))
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View file

@ -154,24 +154,9 @@ fn map_artist_page(
ctx: &MapRespCtx<'_>, ctx: &MapRespCtx<'_>,
skip_extendables: bool, skip_extendables: bool,
) -> Result<MapResult<(MusicArtist, bool)>, ExtractionError> { ) -> Result<MapResult<(MusicArtist, bool)>, ExtractionError> {
let contents = match res.contents { // dbg!(&res);
Some(c) => c,
None => {
if res.microformat.microformat_data_renderer.noindex {
return Err(ExtractionError::NotFound {
id: ctx.id.to_owned(),
msg: "no contents".into(),
});
} else {
return Err(ExtractionError::InvalidData("no contents".into()));
}
}
};
let header = res let header = res.header.music_immersive_header_renderer;
.header
.ok_or(ExtractionError::InvalidData("no header".into()))?
.music_immersive_header_renderer;
if let Some(share) = header.share_endpoint { if let Some(share) = header.share_endpoint {
let pb = share.share_entity_endpoint.serialized_share_entity; let pb = share.share_entity_endpoint.serialized_share_entity;
@ -188,7 +173,8 @@ fn map_artist_page(
} }
} }
let sections = contents let sections = res
.contents
.single_column_browse_results_renderer .single_column_browse_results_renderer
.contents .contents
.into_iter() .into_iter()
@ -352,6 +338,8 @@ impl MapResponse<FirstAlbumPage> for response::MusicArtistAlbums {
self, self,
ctx: &MapRespCtx<'_>, ctx: &MapRespCtx<'_>,
) -> Result<MapResult<FirstAlbumPage>, ExtractionError> { ) -> Result<MapResult<FirstAlbumPage>, ExtractionError> {
// dbg!(&self);
let Some(header) = self.header else { let Some(header) = self.header else {
return Err(ExtractionError::NotFound { return Err(ExtractionError::NotFound {
id: ctx.id.into(), id: ctx.id.into(),

View file

@ -105,6 +105,8 @@ impl MapResponse<Vec<MusicGenreItem>> for response::MusicGenres {
impl MapResponse<MusicGenre> for response::MusicGenre { impl MapResponse<MusicGenre> for response::MusicGenre {
fn map_response(self, ctx: &MapRespCtx<'_>) -> Result<MapResult<MusicGenre>, ExtractionError> { fn map_response(self, ctx: &MapRespCtx<'_>) -> Result<MapResult<MusicGenre>, ExtractionError> {
// dbg!(&self);
let content = self let content = self
.contents .contents
.single_column_browse_results_renderer .single_column_browse_results_renderer

View file

@ -8,7 +8,7 @@ use crate::{
error::{Error, ExtractionError}, error::{Error, ExtractionError},
model::{ model::{
paginator::{ContinuationEndpoint, Paginator}, paginator::{ContinuationEndpoint, Paginator},
AlbumItem, ArtistItem, HistoryItem, MusicPlaylist, MusicPlaylistItem, TrackItem, AlbumItem, ArtistItem, HistoryItem, MusicPlaylistItem, TrackItem,
}, },
serializer::MapResult, serializer::MapResult,
}; };
@ -127,20 +127,6 @@ impl RustyPipeQuery {
) )
.await .await
} }
/// Get all liked YouTube Music tracks of the logged-in user
///
/// The difference to [`RustyPipeQuery::music_saved_tracks`] is that this function only returns
/// tracks that were explicitly liked by the user.
///
/// Requires authentication cookies.
pub async fn music_liked_tracks(&self) -> Result<MusicPlaylist, Error> {
self.clone()
.authenticated()
.music_playlist("LM")
.await
.map_err(crate::util::map_internal_playlist_err)
}
} }
impl MapResponse<Paginator<HistoryItem<TrackItem>>> for response::MusicHistory { impl MapResponse<Paginator<HistoryItem<TrackItem>>> for response::MusicHistory {
@ -209,7 +195,7 @@ mod tests {
#[test] #[test]
fn map_history() { fn map_history() {
let json_path = path!(*TESTFILES / "music_userdata" / "music_history.json"); let json_path = path!(*TESTFILES / "music_history" / "music_history.json");
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();
let history: response::MusicHistory = let history: response::MusicHistory =

View file

@ -9,7 +9,7 @@ use crate::{
AlbumId, ChannelId, MusicAlbum, MusicPlaylist, TrackItem, TrackType, AlbumId, ChannelId, MusicAlbum, MusicPlaylist, TrackItem, TrackType,
}, },
serializer::{text::TextComponents, MapResult}, serializer::{text::TextComponents, MapResult},
util::{self, dictionary, TryRemove, DOT_SEPARATOR}, util::{self, TryRemove, DOT_SEPARATOR},
}; };
use self::response::url_endpoint::MusicPageType; use self::response::url_endpoint::MusicPageType;
@ -87,7 +87,7 @@ impl RustyPipeQuery {
.iter() .iter()
.enumerate() .enumerate()
.filter_map(|(i, track)| { .filter_map(|(i, track)| {
if track.track_type.is_video() && !track.unavailable { if track.track_type.is_video() {
Some((i, track.name.clone())) Some((i, track.name.clone()))
} else { } else {
None None
@ -95,61 +95,47 @@ impl RustyPipeQuery {
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let last_tn = album if !to_replace.is_empty() {
.tracks
.last()
.and_then(|t| t.track_nr)
.unwrap_or_default();
if !to_replace.is_empty() || last_tn < album.track_count {
tracing::debug!(
"fetching album playlist ({} tracks, {} to replace)",
album.track_count,
to_replace.len()
);
let mut playlist = self.music_playlist(playlist_id).await?; let mut playlist = self.music_playlist(playlist_id).await?;
playlist playlist
.tracks .tracks
.extend_limit(&self, album.track_count.into()) .extend_limit(&self, album.tracks.len())
.await?; .await?;
for (i, title) in to_replace { for (i, title) in to_replace {
let found_track = playlist.tracks.items.iter().find_map(|track| { let found_track = playlist.tracks.items.iter().find_map(|track| {
if track.name == title && track.track_type.is_track() { if track.name == title && track.track_type.is_track() {
Some((track.id.clone(), track.duration, track.unavailable)) Some((track.id.clone(), track.duration))
} else { } else {
None None
} }
}); });
if let Some((track_id, duration, unavailable)) = found_track { if let Some((track_id, duration)) = found_track {
album.tracks[i].id = track_id; album.tracks[i].id = track_id;
if let Some(duration) = duration { if let Some(duration) = duration {
album.tracks[i].duration = Some(duration); album.tracks[i].duration = Some(duration);
} }
album.tracks[i].track_type = TrackType::Track; album.tracks[i].track_type = TrackType::Track;
album.tracks[i].unavailable = unavailable;
}
}
// Extend the list of album tracks with the ones from the playlist if the playlist returned more tracks
// This is the case for albums with more than 200 tracks (e.g. audiobooks)
// Note: in some cases the playlist may contain a loop of repeating tracks. If a track was found in the playlist
// that already exists in the album, stop.
if album.tracks.len() < playlist.tracks.items.len() {
let mut tn = last_tn;
for mut t in playlist.tracks.items.into_iter().skip(album.tracks.len()) {
if album.tracks.iter().any(|at| at.id == t.id) {
break;
}
tn += 1;
t.album = album.tracks.first().and_then(|t| t.album.clone());
t.track_nr = Some(tn);
album.tracks.push(t);
} }
} }
} }
} }
Ok(album) Ok(album)
} }
/// Get all liked YouTube Music tracks of the logged-in user
///
/// The difference to [`RustyPipeQuery::music_saved_tracks`] is that this function only returns
/// tracks that were explicitly liked by the user.
///
/// Requires authentication cookies.
pub async fn music_liked_tracks(&self) -> Result<MusicPlaylist, Error> {
self.clone()
.authenticated()
.music_playlist("LM")
.await
.map_err(util::map_internal_playlist_err)
}
} }
impl MapResponse<MusicPlaylist> for response::MusicPlaylist { impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
@ -157,21 +143,9 @@ impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
self, self,
ctx: &MapRespCtx<'_>, ctx: &MapRespCtx<'_>,
) -> Result<MapResult<MusicPlaylist>, ExtractionError> { ) -> Result<MapResult<MusicPlaylist>, ExtractionError> {
let contents = match self.contents { // dbg!(&self);
Some(c) => c,
None => {
if self.microformat.microformat_data_renderer.noindex {
return Err(ExtractionError::NotFound {
id: ctx.id.to_owned(),
msg: "no contents".into(),
});
} else {
return Err(ExtractionError::InvalidData("no contents".into()));
}
}
};
let (header, music_contents) = match contents { let (header, music_contents) = match self.contents {
response::music_playlist::Contents::SingleColumnBrowseResultsRenderer(c) => ( response::music_playlist::Contents::SingleColumnBrowseResultsRenderer(c) => (
self.header, self.header,
c.contents c.contents
@ -302,8 +276,8 @@ impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
// Album playlists fetched via the playlist method dont include a header // Album playlists fetched via the playlist method dont include a header
let (album, cover) = map_res let (album, cover) = map_res
.c .c
.iter() .first()
.find_map(|t: &TrackItem| { .and_then(|t: &TrackItem| {
t.album.as_ref().map(|a| (a.clone(), t.cover.clone())) t.album.as_ref().map(|a| (a.clone(), t.cover.clone()))
}) })
.ok_or(ExtractionError::InvalidData(Cow::Borrowed( .ok_or(ExtractionError::InvalidData(Cow::Borrowed(
@ -311,8 +285,7 @@ impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
)))?; )))?;
if !map_res.c.iter().all(|t| { if !map_res.c.iter().all(|t| {
t.unavailable t.album
|| t.album
.as_ref() .as_ref()
.map(|a| a.id == album.id) .map(|a| a.id == album.id)
.unwrap_or_default() .unwrap_or_default()
@ -359,21 +332,9 @@ impl MapResponse<MusicPlaylist> for response::MusicPlaylist {
impl MapResponse<MusicAlbum> for response::MusicPlaylist { impl MapResponse<MusicAlbum> for response::MusicPlaylist {
fn map_response(self, ctx: &MapRespCtx<'_>) -> Result<MapResult<MusicAlbum>, ExtractionError> { fn map_response(self, ctx: &MapRespCtx<'_>) -> Result<MapResult<MusicAlbum>, ExtractionError> {
let contents = match self.contents { // dbg!(&self);
Some(c) => c,
None => {
if self.microformat.microformat_data_renderer.noindex {
return Err(ExtractionError::NotFound {
id: ctx.id.to_owned(),
msg: "no contents".into(),
});
} else {
return Err(ExtractionError::InvalidData("no contents".into()));
}
}
};
let (header, sections) = match contents { let (header, sections) = match self.contents {
response::music_playlist::Contents::SingleColumnBrowseResultsRenderer(c) => ( response::music_playlist::Contents::SingleColumnBrowseResultsRenderer(c) => (
self.header, self.header,
c.contents c.contents
@ -413,19 +374,8 @@ impl MapResponse<MusicAlbum> for response::MusicPlaylist {
match section { match section {
response::music_item::ItemSection::MusicShelfRenderer(sh) => shelf = Some(sh), response::music_item::ItemSection::MusicShelfRenderer(sh) => shelf = Some(sh),
response::music_item::ItemSection::MusicCarouselShelfRenderer(sh) => { response::music_item::ItemSection::MusicCarouselShelfRenderer(sh) => {
if sh
.header
.map(|h| {
h.music_carousel_shelf_basic_header_renderer
.title
.first_str()
== dictionary::entry(ctx.lang).album_versions_title
})
.unwrap_or_default()
{
album_variants = Some(sh.contents); album_variants = Some(sh.contents);
} }
}
_ => (), _ => (),
} }
} }
@ -489,12 +439,10 @@ impl MapResponse<MusicAlbum> for response::MusicPlaylist {
} }
} }
let playlist_id = self let playlist_id = self.microformat.and_then(|mf| {
.microformat mf.microformat_data_renderer
.microformat_data_renderer
.url_canonical .url_canonical
.and_then(|x| { .strip_prefix("https://music.youtube.com/playlist?list=")
x.strip_prefix("https://music.youtube.com/playlist?list=")
.map(str::to_owned) .map(str::to_owned)
}); });
let (playlist_id, artist_id) = header let (playlist_id, artist_id) = header
@ -523,14 +471,6 @@ impl MapResponse<MusicAlbum> for response::MusicPlaylist {
.unwrap_or_default(); .unwrap_or_default();
let artist_id = artist_id.or_else(|| artists.first().and_then(|a| a.id.clone())); let artist_id = artist_id.or_else(|| artists.first().and_then(|a| a.id.clone()));
let second_subtitle_parts = header
.second_subtitle
.split(|p| p == DOT_SEPARATOR)
.collect::<Vec<_>>();
let track_count = second_subtitle_parts
.get(usize::from(second_subtitle_parts.len() > 2))
.and_then(|txt| util::parse_numeric::<u16>(&txt[0]).ok());
let mut mapper = MusicListMapper::with_album( let mut mapper = MusicListMapper::with_album(
ctx.lang, ctx.lang,
artists.clone(), artists.clone(),
@ -565,7 +505,6 @@ impl MapResponse<MusicAlbum> for response::MusicPlaylist {
album_type, album_type,
year, year,
by_va, by_va,
track_count: track_count.unwrap_or(tracks_res.c.len() as u16),
tracks: tracks_res.c, tracks: tracks_res.c,
variants: variants_res.c, variants: variants_res.c,
}, },
@ -616,8 +555,8 @@ mod tests {
#[case::single("single", "MPREb_bHfHGoy7vuv")] #[case::single("single", "MPREb_bHfHGoy7vuv")]
#[case::description("description", "MPREb_PiyfuVl6aYd")] #[case::description("description", "MPREb_PiyfuVl6aYd")]
#[case::unavailable("unavailable", "MPREb_AzuWg8qAVVl")] #[case::unavailable("unavailable", "MPREb_AzuWg8qAVVl")]
#[case::unavailable("unavailable", "MPREb_AzuWg8qAVVl")]
#[case::two_columns("20240228_twoColumns", "MPREb_bHfHGoy7vuv")] #[case::two_columns("20240228_twoColumns", "MPREb_bHfHGoy7vuv")]
#[case::recommends("20250225_recommends", "MPREb_u1I69lSAe5v")]
fn map_music_album(#[case] name: &str, #[case] id: &str) { fn map_music_album(#[case] name: &str, #[case] id: &str) {
let json_path = path!(*TESTFILES / "music_playlist" / format!("album_{name}.json")); let json_path = path!(*TESTFILES / "music_playlist" / format!("album_{name}.json"));
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();

View file

@ -155,6 +155,8 @@ impl<T: FromYtItem> MapResponse<MusicSearchResult<T>> for response::MusicSearch
self, self,
ctx: &MapRespCtx<'_>, ctx: &MapRespCtx<'_>,
) -> Result<MapResult<MusicSearchResult<T>>, ExtractionError> { ) -> Result<MapResult<MusicSearchResult<T>>, ExtractionError> {
// dbg!(&self);
let tabs = self.contents.tabbed_search_results_renderer.contents; let tabs = self.contents.tabbed_search_results_renderer.contents;
let sections = tabs let sections = tabs
.into_iter() .into_iter()

View file

@ -6,15 +6,12 @@ use crate::model::{
traits::FromYtItem, traits::FromYtItem,
Comment, MusicItem, YouTubeItem, Comment, MusicItem, YouTubeItem,
}; };
use crate::model::{HistoryItem, TrackItem, VideoItem};
use crate::serializer::MapResult; use crate::serializer::MapResult;
#[cfg(feature = "userdata")] use self::response::YouTubeListItem;
use crate::model::{HistoryItem, TrackItem, VideoItem};
use super::response::{ use super::response::music_item::{map_queue_item, MusicListMapper, PlaylistPanelVideo};
music_item::{map_queue_item, MusicListMapper, PlaylistPanelVideo},
YouTubeListItem,
};
use super::{ use super::{
response, ClientType, MapRespCtx, MapRespOptions, MapResponse, QContinuation, RustyPipeQuery, response, ClientType, MapRespCtx, MapRespOptions, MapResponse, QContinuation, RustyPipeQuery,
}; };
@ -228,7 +225,6 @@ impl MapResponse<Paginator<MusicItem>> for response::MusicContinuation {
} }
} }
#[cfg(feature = "userdata")]
impl MapResponse<Paginator<HistoryItem<VideoItem>>> for response::Continuation { impl MapResponse<Paginator<HistoryItem<VideoItem>>> for response::Continuation {
fn map_response( fn map_response(
self, self,
@ -249,9 +245,11 @@ impl MapResponse<Paginator<HistoryItem<VideoItem>>> for response::Continuation {
&mut map_res, &mut map_res,
); );
} }
response::YouTubeListItem::ContinuationItemRenderer(ep) => { response::YouTubeListItem::ContinuationItemRenderer {
continuation_endpoint,
} => {
if ctoken.is_none() { if ctoken.is_none() {
ctoken = ep.continuation_endpoint.into_token(); ctoken = Some(continuation_endpoint.continuation_command.token);
} }
} }
_ => {} _ => {}
@ -272,7 +270,6 @@ impl MapResponse<Paginator<HistoryItem<VideoItem>>> for response::Continuation {
} }
} }
#[cfg(feature = "userdata")]
impl MapResponse<Paginator<HistoryItem<TrackItem>>> for response::MusicContinuation { impl MapResponse<Paginator<HistoryItem<TrackItem>>> for response::MusicContinuation {
fn map_response( fn map_response(
self, self,
@ -425,8 +422,6 @@ impl Paginator<Comment> {
} }
} }
#[cfg(feature = "userdata")]
#[cfg_attr(docsrs, doc(cfg(feature = "userdata")))]
impl Paginator<HistoryItem<VideoItem>> { impl Paginator<HistoryItem<VideoItem>> {
/// Get the next page from the paginator (or `None` if the paginator is exhausted) /// Get the next page from the paginator (or `None` if the paginator is exhausted)
pub async fn next<Q: AsRef<RustyPipeQuery>>(&self, query: Q) -> Result<Option<Self>, Error> { pub async fn next<Q: AsRef<RustyPipeQuery>>(&self, query: Q) -> Result<Option<Self>, Error> {
@ -442,8 +437,6 @@ impl Paginator<HistoryItem<VideoItem>> {
} }
} }
#[cfg(feature = "userdata")]
#[cfg_attr(docsrs, doc(cfg(feature = "userdata")))]
impl Paginator<HistoryItem<TrackItem>> { impl Paginator<HistoryItem<TrackItem>> {
/// Get the next page from the paginator (or `None` if the paginator is exhausted) /// Get the next page from the paginator (or `None` if the paginator is exhausted)
pub async fn next<Q: AsRef<RustyPipeQuery>>(&self, query: Q) -> Result<Option<Self>, Error> { pub async fn next<Q: AsRef<RustyPipeQuery>>(&self, query: Q) -> Result<Option<Self>, Error> {
@ -540,11 +533,7 @@ macro_rules! paginator {
} }
paginator!(Comment); paginator!(Comment);
#[cfg(feature = "userdata")]
#[cfg_attr(docsrs, doc(cfg(feature = "userdata")))]
paginator!(HistoryItem<VideoItem>); paginator!(HistoryItem<VideoItem>);
#[cfg(feature = "userdata")]
#[cfg_attr(docsrs, doc(cfg(feature = "userdata")))]
paginator!(HistoryItem<TrackItem>); paginator!(HistoryItem<TrackItem>);
#[cfg(test)] #[cfg(test)]
@ -631,7 +620,7 @@ mod tests {
} }
#[rstest] #[rstest]
#[case::subscriptions("subscriptions", path!("userdata" / "subscriptions.json"))] #[case::subscriptions("subscriptions", path!("history" / "subscriptions.json"))]
fn map_continuation_channels(#[case] name: &str, #[case] path: PathBuf) { fn map_continuation_channels(#[case] name: &str, #[case] path: PathBuf) {
let json_path = path!(*TESTFILES / path); let json_path = path!(*TESTFILES / path);
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();
@ -655,7 +644,7 @@ mod tests {
#[case::playlist_tracks("playlist_tracks", path!("music_playlist" / "playlist_cont.json"))] #[case::playlist_tracks("playlist_tracks", path!("music_playlist" / "playlist_cont.json"))]
#[case::search_tracks("search_tracks", path!("music_search" / "tracks_cont.json"))] #[case::search_tracks("search_tracks", path!("music_search" / "tracks_cont.json"))]
#[case::radio_tracks("radio_tracks", path!("music_details" / "radio_cont.json"))] #[case::radio_tracks("radio_tracks", path!("music_details" / "radio_cont.json"))]
#[case::saved_tracks("saved_tracks", path!("music_userdata" / "saved_tracks.json"))] #[case::saved_tracks("saved_tracks", path!("music_history" / "saved_tracks.json"))]
fn map_continuation_tracks(#[case] name: &str, #[case] path: PathBuf) { fn map_continuation_tracks(#[case] name: &str, #[case] path: PathBuf) {
let json_path = path!(*TESTFILES / path); let json_path = path!(*TESTFILES / path);
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();
@ -676,7 +665,7 @@ mod tests {
} }
#[rstest] #[rstest]
#[case::saved_artists("saved_artists", path!("music_userdata" / "saved_artists.json"))] #[case::saved_artists("saved_artists", path!("music_history" / "saved_artists.json"))]
fn map_continuation_artists(#[case] name: &str, #[case] path: PathBuf) { fn map_continuation_artists(#[case] name: &str, #[case] path: PathBuf) {
let json_path = path!(*TESTFILES / path); let json_path = path!(*TESTFILES / path);
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();
@ -697,7 +686,7 @@ mod tests {
} }
#[rstest] #[rstest]
#[case::saved_albums("saved_albums", path!("music_userdata" / "saved_albums.json"))] #[case::saved_albums("saved_albums", path!("music_history" / "saved_albums.json"))]
fn map_continuation_albums(#[case] name: &str, #[case] path: PathBuf) { fn map_continuation_albums(#[case] name: &str, #[case] path: PathBuf) {
let json_path = path!(*TESTFILES / path); let json_path = path!(*TESTFILES / path);
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();
@ -719,7 +708,7 @@ mod tests {
#[rstest] #[rstest]
#[case::playlist_related("playlist_related", path!("music_playlist" / "playlist_related.json"))] #[case::playlist_related("playlist_related", path!("music_playlist" / "playlist_related.json"))]
#[case::saved_playlists("saved_playlists", path!("music_userdata" / "saved_playlists.json"))] #[case::saved_playlists("saved_playlists", path!("music_history" / "saved_playlists.json"))]
fn map_continuation_music_playlists(#[case] name: &str, #[case] path: PathBuf) { fn map_continuation_music_playlists(#[case] name: &str, #[case] path: PathBuf) {
let json_path = path!(*TESTFILES / path); let json_path = path!(*TESTFILES / path);
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();

View file

@ -1,6 +1,6 @@
use std::{ use std::{
borrow::Cow, borrow::Cow,
collections::{BTreeMap, HashMap, HashSet}, collections::{BTreeMap, HashMap},
fmt::Debug, fmt::Debug,
}; };
@ -104,29 +104,42 @@ impl RustyPipeQuery {
) -> Result<VideoPlayer, Error> { ) -> Result<VideoPlayer, Error> {
let video_id = video_id.as_ref(); let video_id = video_id.as_ref();
let mut last_e = None; let mut last_e = None;
let mut query = Cow::Borrowed(self);
let mut clients_iter = clients.iter().peekable(); let mut clients_iter = clients.iter().peekable();
let mut failed_clients = HashSet::new();
while let Some(client) = clients_iter.next() { while let Some(client) = clients_iter.next() {
if query.opts.auth == Some(true) && !self.auth_enabled(*client) { if self.opts.auth == Some(true) && !self.auth_enabled(*client) {
// If no client has auth enabled, return NoLogin error instead of "no clients" // If no client has auth enabled, return NoLogin error instead of "no clients"
if last_e.is_none() { if last_e.is_none() {
last_e = Some(Error::Auth(AuthError::NoLogin)); last_e = Some(Error::Auth(AuthError::NoLogin));
} }
continue; continue;
} }
if failed_clients.contains(client) {
continue;
}
let res = query.player_from_client(video_id, *client).await; let res = self.player_from_client(video_id, *client).await;
match res { match res {
Ok(res) => return Ok(res), Ok(res) => return Ok(res),
Err(Error::Extraction(e)) => { Err(Error::Extraction(e)) => {
if e.use_login() && query.opts.auth.is_none() { if e.use_login() {
clients_iter = clients.iter().peekable(); if let Some(c) = self.auth_enabled_client(clients) {
query = Cow::Owned(self.clone().authenticated()); tracing::info!("{e}; fetching player with login");
match self
.clone()
.authenticated()
.player_from_client(video_id, c)
.await
{
Ok(res) => return Ok(res),
Err(Error::Extraction(e)) => {
if !e.switch_client() {
return Err(Error::Extraction(e));
}
}
Err(e) => return Err(e),
}
} else {
return Err(Error::Extraction(e));
}
} else if !e.switch_client() { } else if !e.switch_client() {
return Err(Error::Extraction(e)); return Err(Error::Extraction(e));
} }
@ -134,7 +147,6 @@ impl RustyPipeQuery {
tracing::warn!("error fetching player with {client:?} client: {e}; retrying with {next_client:?} client"); tracing::warn!("error fetching player with {client:?} client: {e}; retrying with {next_client:?} client");
} }
last_e = Some(Error::Extraction(e)); last_e = Some(Error::Extraction(e));
failed_clients.insert(*client);
} }
Err(e) => return Err(e), Err(e) => return Err(e),
} }
@ -144,27 +156,22 @@ impl RustyPipeQuery {
async fn get_player_po_token(&self, video_id: &str) -> Result<PlayerPoToken, Error> { async fn get_player_po_token(&self, video_id: &str) -> Result<PlayerPoToken, Error> {
if let Some(bg) = &self.client.inner.botguard { if let Some(bg) = &self.client.inner.botguard {
let (ident, visitor_data) = if self.opts.auth == Some(true) {
(self.client.user_auth_datasync_id()?, None)
} else {
let visitor_data = self.get_visitor_data(false).await?; let visitor_data = self.get_visitor_data(false).await?;
(visitor_data.to_owned(), Some(visitor_data))
};
if bg.po_token_cache { if bg.po_token_cache {
let session_token = self.get_session_po_token(&ident).await?; let session_token = self.get_session_po_token(&visitor_data).await?;
Ok(PlayerPoToken { Ok(PlayerPoToken {
visitor_data, visitor_data: Some(visitor_data),
session_po_token: Some(session_token), session_po_token: Some(session_token),
content_po_token: None, content_po_token: None,
}) })
} else { } else {
let (po_tokens, valid_until) = self.get_po_tokens(&[video_id, &ident]).await?; let (po_tokens, valid_until) =
self.get_po_tokens(&[video_id, &visitor_data]).await?;
let mut po_tokens = po_tokens.into_iter(); let mut po_tokens = po_tokens.into_iter();
let po_token = po_tokens.next().unwrap(); let po_token = po_tokens.next().unwrap();
let session_po_token = po_tokens.next().unwrap(); let session_po_token = po_tokens.next().unwrap();
Ok(PlayerPoToken { Ok(PlayerPoToken {
visitor_data, visitor_data: Some(visitor_data),
session_po_token: Some(PoToken { session_po_token: Some(PoToken {
po_token: session_po_token, po_token: session_po_token,
valid_until, valid_until,
@ -184,11 +191,6 @@ impl RustyPipeQuery {
video_id: S, video_id: S,
client_type: ClientType, client_type: ClientType,
) -> Result<VideoPlayer, Error> { ) -> Result<VideoPlayer, Error> {
if self.opts.auth == Some(true) {
tracing::info!("fetching {client_type:?} player with login");
} else {
tracing::debug!("fetching {client_type:?} player");
}
let video_id = video_id.as_ref(); let video_id = video_id.as_ref();
let (deobf, player_po) = tokio::try_join!( let (deobf, player_po) = tokio::try_join!(
@ -307,15 +309,13 @@ impl MapResponse<VideoPlayer> for response::Player {
error_screen, error_screen,
} => { } => {
let mut msg = reason; let mut msg = reason;
if let Some(error_screen) = error_screen.player_error_message_renderer { if let Some(error_screen) = error_screen {
msg.push_str(" - "); msg.push_str(" - ");
msg.push_str(&error_screen.subreason); msg.push_str(&error_screen.player_error_message_renderer.subreason);
} }
let reason = if error_screen.player_captcha_view_model.is_some() { let reason = msg
UnavailabilityReason::Captcha .split_whitespace()
} else {
msg.split_whitespace()
.find_map(|word| match word { .find_map(|word| match word {
"payment" => Some(UnavailabilityReason::Paid), "payment" => Some(UnavailabilityReason::Paid),
"Premium" => Some(UnavailabilityReason::Premium), "Premium" => Some(UnavailabilityReason::Premium),
@ -323,12 +323,10 @@ impl MapResponse<VideoPlayer> for response::Player {
"country" => Some(UnavailabilityReason::Geoblocked), "country" => Some(UnavailabilityReason::Geoblocked),
"version" | "websites" => Some(UnavailabilityReason::UnsupportedClient), "version" | "websites" => Some(UnavailabilityReason::UnsupportedClient),
"bot" => Some(UnavailabilityReason::IpBan), "bot" => Some(UnavailabilityReason::IpBan),
"VPN/Proxy" => Some(UnavailabilityReason::VpnBan),
"later." => Some(UnavailabilityReason::TryAgain), "later." => Some(UnavailabilityReason::TryAgain),
_ => None, _ => None,
}) })
.unwrap_or_default() .unwrap_or_default();
};
return Err(ExtractionError::Unavailable { reason, msg }); return Err(ExtractionError::Unavailable { reason, msg });
} }
response::player::PlayabilityStatus::LoginRequired { reason, messages } => { response::player::PlayabilityStatus::LoginRequired { reason, messages } => {
@ -387,21 +385,6 @@ impl MapResponse<VideoPlayer> for response::Player {
video_details.video_id, ctx.id video_details.video_id, ctx.id
))); )));
} }
// Sometimes YouTube Desktop does not output any URLs for adaptive streams.
// Since this is currently rare, it is best to retry the request in this case.
if !is_live
&& !streaming_data.adaptive_formats.c.is_empty()
&& streaming_data
.adaptive_formats
.c
.iter()
.all(|f| f.url.is_none() && f.signature_cipher.is_none())
{
return Err(ExtractionError::Unavailable {
reason: UnavailabilityReason::TryAgain,
msg: "no adaptive stream URLs".to_owned(),
});
}
let video_info = VideoPlayerDetails { let video_info = VideoPlayerDetails {
id: video_details.video_id, id: video_details.video_id,
@ -644,7 +627,7 @@ impl<'a> StreamsMapper<'a> {
fn deobf(&self) -> Result<&Deobfuscator, DeobfError> { fn deobf(&self) -> Result<&Deobfuscator, DeobfError> {
self.deobf self.deobf
.as_ref() .as_ref()
.ok_or(DeobfError::Other("no deobfuscator".into())) .ok_or(DeobfError::Other("no deobfuscator"))
} }
fn cipher_to_url_params( fn cipher_to_url_params(

View file

@ -33,6 +33,28 @@ impl RustyPipeQuery {
) )
.await .await
} }
/// Get all liked videos of the logged-in user
///
/// Requires authentication cookies.
pub async fn liked_videos(&self) -> Result<Playlist, Error> {
self.clone()
.authenticated()
.playlist("LL")
.await
.map_err(util::map_internal_playlist_err)
}
/// Get the "Watch later" playlist of the logged-in user
///
/// Requires authentication cookies.
pub async fn watch_later(&self) -> Result<Playlist, Error> {
self.clone()
.authenticated()
.playlist("WL")
.await
.map_err(util::map_internal_playlist_err)
}
} }
impl MapResponse<Playlist> for response::Playlist { impl MapResponse<Playlist> for response::Playlist {
@ -140,10 +162,10 @@ impl MapResponse<Playlist> for response::Playlist {
.next() .next()
.and_then(|r| r.metadata_parts.into_iter().next()) .and_then(|r| r.metadata_parts.into_iter().next())
.and_then(|p| match p { .and_then(|p| match p {
response::MetadataPart::Text { .. } => None, response::MetadataPart::Text(_) => None,
response::MetadataPart::AvatarStack { avatar_stack } => { response::MetadataPart::AvatarStack {
ChannelId::try_from(avatar_stack.avatar_stack_view_model.text).ok() avatar_stack_view_model,
} } => ChannelId::try_from(avatar_stack_view_model.text).ok(),
}); });
// remove "by" prefix // remove "by" prefix
if let Some(c) = channel.as_mut() { if let Some(c) = channel.as_mut() {
@ -257,7 +279,6 @@ mod tests {
#[case::nomusic("nomusic", "PL1J-6JOckZtE_P9Xx8D3b2O6w0idhuKBe")] #[case::nomusic("nomusic", "PL1J-6JOckZtE_P9Xx8D3b2O6w0idhuKBe")]
#[case::live("live", "UULVvqRdlKsE5Q8mf8YXbdIJLw")] #[case::live("live", "UULVvqRdlKsE5Q8mf8YXbdIJLw")]
#[case::pageheader("20241011_pageheader", "PLT2w2oBf1TZKyvY_M6JsASs73m-wjLzH5")] #[case::pageheader("20241011_pageheader", "PLT2w2oBf1TZKyvY_M6JsASs73m-wjLzH5")]
#[case::cmdexecutor("20250316_cmdexecutor", "PLbZIPy20-1pN7mqjckepWF78ndb6ci_qi")]
fn map_playlist_data(#[case] name: &str, #[case] id: &str) { fn map_playlist_data(#[case] name: &str, #[case] id: &str) {
let json_path = path!(*TESTFILES / "playlist" / format!("playlist_{name}.json")); let json_path = path!(*TESTFILES / "playlist" / format!("playlist_{name}.json"));
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();

View file

@ -1,8 +1,10 @@
pub(crate) mod channel; pub(crate) mod channel;
pub(crate) mod history;
pub(crate) mod music_artist; pub(crate) mod music_artist;
pub(crate) mod music_charts; pub(crate) mod music_charts;
pub(crate) mod music_details; pub(crate) mod music_details;
pub(crate) mod music_genres; pub(crate) mod music_genres;
pub(crate) mod music_history;
pub(crate) mod music_item; pub(crate) mod music_item;
pub(crate) mod music_new; pub(crate) mod music_new;
pub(crate) mod music_playlist; pub(crate) mod music_playlist;
@ -17,6 +19,7 @@ pub(crate) mod video_item;
pub(crate) use channel::Channel; pub(crate) use channel::Channel;
pub(crate) use channel::ChannelAbout; pub(crate) use channel::ChannelAbout;
pub(crate) use history::History;
pub(crate) use music_artist::MusicArtist; pub(crate) use music_artist::MusicArtist;
pub(crate) use music_artist::MusicArtistAlbums; pub(crate) use music_artist::MusicArtistAlbums;
pub(crate) use music_charts::MusicCharts; pub(crate) use music_charts::MusicCharts;
@ -25,6 +28,7 @@ pub(crate) use music_details::MusicLyrics;
pub(crate) use music_details::MusicRelated; pub(crate) use music_details::MusicRelated;
pub(crate) use music_genres::MusicGenre; pub(crate) use music_genres::MusicGenre;
pub(crate) use music_genres::MusicGenres; pub(crate) use music_genres::MusicGenres;
pub(crate) use music_history::MusicHistory;
pub(crate) use music_item::MusicContinuation; pub(crate) use music_item::MusicContinuation;
pub(crate) use music_new::MusicNew; pub(crate) use music_new::MusicNew;
pub(crate) use music_playlist::MusicPlaylist; pub(crate) use music_playlist::MusicPlaylist;
@ -47,15 +51,6 @@ pub(crate) mod channel_rss;
#[cfg(feature = "rss")] #[cfg(feature = "rss")]
pub(crate) use channel_rss::ChannelRss; pub(crate) use channel_rss::ChannelRss;
#[cfg(feature = "userdata")]
pub(crate) mod history;
#[cfg(feature = "userdata")]
pub(crate) use history::History;
#[cfg(feature = "userdata")]
pub(crate) mod music_history;
#[cfg(feature = "userdata")]
pub(crate) use music_history::MusicHistory;
use std::borrow::Cow; use std::borrow::Cow;
use std::collections::HashMap; use std::collections::HashMap;
use std::marker::PhantomData; use std::marker::PhantomData;
@ -152,16 +147,9 @@ pub(crate) struct ContinuationItemRenderer {
pub continuation_endpoint: ContinuationEndpoint, pub continuation_endpoint: ContinuationEndpoint,
} }
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub(crate) enum ContinuationEndpoint {
ContinuationCommand(ContinuationCommandWrap),
CommandExecutorCommand(CommandExecutorCommandWrap),
}
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct ContinuationCommandWrap { pub(crate) struct ContinuationEndpoint {
pub continuation_command: ContinuationCommand, pub continuation_command: ContinuationCommand,
} }
@ -171,34 +159,7 @@ pub(crate) struct ContinuationCommand {
pub token: String, pub token: String,
} }
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CommandExecutorCommandWrap {
pub command_executor_command: CommandExecutorCommand,
}
#[serde_as] #[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CommandExecutorCommand {
#[serde_as(as = "VecSkipError<_>")]
commands: Vec<ContinuationCommandWrap>,
}
impl ContinuationEndpoint {
pub fn into_token(self) -> Option<String> {
match self {
Self::ContinuationCommand(cmd) => Some(cmd.continuation_command.token),
Self::CommandExecutorCommand(cmd) => cmd
.command_executor_command
.commands
.into_iter()
.next()
.map(|c| c.continuation_command.token),
}
}
}
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct Icon { pub(crate) struct Icon {
@ -646,37 +607,32 @@ pub(crate) struct PhMetadataRow {
} }
#[serde_as] #[serde_as]
#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub(crate) enum MetadataPart {
Text {
#[serde_as(as = "AttributedText")]
text: TextComponent,
},
#[serde(rename_all = "camelCase")]
AvatarStack { avatar_stack: AvatarStackInner },
}
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct AvatarStackInner { pub(crate) enum MetadataPart {
pub avatar_stack_view_model: TextComponentBox, Text(#[serde_as(as = "AttributedText")] TextComponent),
#[serde(rename_all = "camelCase")]
AvatarStack {
avatar_stack_view_model: TextComponentBox,
},
} }
impl MetadataPart { impl MetadataPart {
pub fn into_text_component(self) -> TextComponent { pub fn into_text_component(self) -> TextComponent {
match self { match self {
MetadataPart::Text { text } => text, MetadataPart::Text(text_component) => text_component,
MetadataPart::AvatarStack { avatar_stack } => avatar_stack.avatar_stack_view_model.text, MetadataPart::AvatarStack {
avatar_stack_view_model,
} => avatar_stack_view_model.text,
} }
} }
pub fn as_str(&self) -> &str { pub fn as_str(&self) -> &str {
match self { match self {
MetadataPart::Text { text } => text.as_str(), MetadataPart::Text(s) => s.as_str(),
MetadataPart::AvatarStack { avatar_stack } => { MetadataPart::AvatarStack {
avatar_stack.avatar_stack_view_model.text.as_str() avatar_stack_view_model,
} } => avatar_stack_view_model.text.as_str(),
} }
} }
} }

View file

@ -5,8 +5,7 @@ use crate::serializer::text::Text;
use super::{ use super::{
music_item::{ music_item::{
Button, Grid, ItemSection, MusicMicroformat, MusicThumbnailRenderer, SimpleHeader, Button, Grid, ItemSection, MusicThumbnailRenderer, SimpleHeader, SingleColumnBrowseResult,
SingleColumnBrowseResult,
}, },
SectionList, Tab, SectionList, Tab,
}; };
@ -15,10 +14,8 @@ use super::{
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct MusicArtist { pub(crate) struct MusicArtist {
pub contents: Option<SingleColumnBrowseResult<Tab<SectionList<ItemSection>>>>, pub contents: SingleColumnBrowseResult<Tab<SectionList<ItemSection>>>,
pub header: Option<Header>, pub header: Header,
#[serde(default)]
pub microformat: MusicMicroformat,
} }
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]

View file

@ -1,10 +1,11 @@
use serde::Deserialize; use serde::Deserialize;
use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError}; use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError};
use time::UtcOffset;
use crate::{ use crate::{
model::{ model::{
self, traits::FromYtItem, AlbumId, AlbumItem, AlbumType, ArtistId, ArtistItem, ChannelId, self, traits::FromYtItem, AlbumId, AlbumItem, AlbumType, ArtistId, ArtistItem, ChannelId,
MusicItem, MusicItemType, MusicPlaylistItem, TrackItem, UserItem, HistoryItem, MusicItem, MusicItemType, MusicPlaylistItem, TrackItem, UserItem,
}, },
param::Language, param::Language,
serializer::{ serializer::{
@ -22,11 +23,6 @@ use super::{
SimpleHeaderRenderer, Thumbnails, ThumbnailsWrap, SimpleHeaderRenderer, Thumbnails, ThumbnailsWrap,
}; };
#[cfg(feature = "userdata")]
use crate::model::HistoryItem;
#[cfg(feature = "userdata")]
use time::UtcOffset;
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) enum ItemSection { pub(crate) enum ItemSection {
@ -44,7 +40,6 @@ pub(crate) enum ItemSection {
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct MusicShelf { pub(crate) struct MusicShelf {
#[cfg(feature = "userdata")]
#[serde_as(as = "Option<Text>")] #[serde_as(as = "Option<Text>")]
pub title: Option<String>, pub title: Option<String>,
/// Playlist ID (only for playlists) /// Playlist ID (only for playlists)
@ -433,22 +428,6 @@ pub(crate) enum TrackBadge {
LiveBadgeRenderer {}, LiveBadgeRenderer {},
} }
#[serde_as]
#[derive(Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct MusicMicroformat {
#[serde_as(as = "DefaultOnError")]
pub microformat_data_renderer: MicroformatData,
}
#[derive(Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct MicroformatData {
pub url_canonical: Option<String>,
#[serde(default)]
pub noindex: bool,
}
/* /*
#MAPPER #MAPPER
*/ */
@ -546,9 +525,7 @@ impl MusicListMapper {
MusicResponseItem::ContinuationItemRenderer { MusicResponseItem::ContinuationItemRenderer {
continuation_endpoint, continuation_endpoint,
} => { } => {
if self.ctoken.is_none() { self.ctoken = Some(continuation_endpoint.continuation_command.token);
self.ctoken = continuation_endpoint.into_token();
}
Ok(None) Ok(None)
} }
} }
@ -797,7 +774,6 @@ impl MusicListMapper {
track_type: vtype.into(), track_type: vtype.into(),
track_nr, track_nr,
by_va, by_va,
unavailable: item.music_item_renderer_display_policy == DisplayPolicy::GreyOut,
})); }));
Ok(Some(MusicItemType::Track)) Ok(Some(MusicItemType::Track))
} }
@ -978,7 +954,6 @@ impl MusicListMapper {
track_type: vtype.into(), track_type: vtype.into(),
track_nr: None, track_nr: None,
by_va, by_va,
unavailable: false,
})); }));
Ok(Some(MusicItemType::Track)) Ok(Some(MusicItemType::Track))
} }
@ -1143,7 +1118,6 @@ impl MusicListMapper {
track_type: vtype.into(), track_type: vtype.into(),
track_nr: None, track_nr: None,
by_va, by_va,
unavailable: false,
})); }));
} else { } else {
let (artists, by_va) = map_artists(subtitle_p2); let (artists, by_va) = map_artists(subtitle_p2);
@ -1181,7 +1155,6 @@ impl MusicListMapper {
track_type: vtype.into(), track_type: vtype.into(),
track_nr: None, track_nr: None,
by_va, by_va,
unavailable: false,
})); }));
} }
Some(MusicItemType::Track) Some(MusicItemType::Track)
@ -1297,7 +1270,6 @@ impl MusicListMapper {
} }
} }
#[cfg(feature = "userdata")]
pub fn conv_history_items( pub fn conv_history_items(
self, self,
date_txt: Option<String>, date_txt: Option<String>,
@ -1439,7 +1411,6 @@ pub(crate) fn map_queue_item(item: QueueMusicItem, lang: Language) -> MapResult<
track_type: MusicVideoType::from_is_video(is_video).into(), track_type: MusicVideoType::from_is_video(is_video).into(),
track_nr: None, track_nr: None,
by_va, by_va,
unavailable: false,
}, },
warnings, warnings,
} }

View file

@ -5,21 +5,22 @@ use crate::serializer::text::{AttributedText, Text, TextComponents};
use super::{ use super::{
music_item::{ music_item::{
Button, ItemSection, MusicContentsRenderer, MusicItemMenuEntry, MusicMicroformat, Button, ItemSection, MusicContentsRenderer, MusicItemMenuEntry, MusicThumbnailRenderer,
MusicThumbnailRenderer,
}, },
url_endpoint::OnTapWrap, url_endpoint::OnTapWrap,
ContentsRenderer, SectionList, Tab, ContentsRenderer, SectionList, Tab,
}; };
/// Response model for YouTube Music playlists and albums /// Response model for YouTube Music playlists and albums
#[serde_as]
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct MusicPlaylist { pub(crate) struct MusicPlaylist {
pub contents: Option<Contents>, pub contents: Contents,
pub header: Option<Header>, pub header: Option<Header>,
#[serde(default)] #[serde(default)]
pub microformat: MusicMicroformat, #[serde_as(as = "DefaultOnError")]
pub microformat: Option<Microformat>,
} }
#[serde_as] #[serde_as]
@ -161,3 +162,15 @@ pub(crate) struct AvatarStackViewModel {
pub(crate) struct AvatarStackRendererContext { pub(crate) struct AvatarStackRendererContext {
pub command_context: Option<OnTapWrap>, pub command_context: Option<OnTapWrap>,
} }
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Microformat {
pub microformat_data_renderer: MicroformatData,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct MicroformatData {
pub url_canonical: String,
}

View file

@ -37,7 +37,8 @@ pub(crate) enum PlayabilityStatus {
#[serde(default)] #[serde(default)]
reason: String, reason: String,
#[serde(default)] #[serde(default)]
error_screen: ErrorScreen, #[serde_as(deserialize_as = "DefaultOnError")]
error_screen: Option<ErrorScreen>,
}, },
/// Age limit / Private video /// Age limit / Private video
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@ -60,18 +61,14 @@ pub(crate) enum PlayabilityStatus {
}, },
} }
#[serde_as] #[derive(Debug, Deserialize)]
#[derive(Default, Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct ErrorScreen { pub(crate) struct ErrorScreen {
#[serde(default)] pub player_error_message_renderer: ErrorMessage,
#[serde_as(deserialize_as = "DefaultOnError")]
pub player_error_message_renderer: Option<ErrorMessage>,
pub player_captcha_view_model: Option<Empty>,
} }
#[serde_as] #[serde_as]
#[derive(Default, Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct ErrorMessage { pub(crate) struct ErrorMessage {
#[serde_as(as = "Text")] #[serde_as(as = "Text")]

View file

@ -530,14 +530,15 @@ pub(crate) enum ContinuationItemVariants {
} }
impl ContinuationItemVariants { impl ContinuationItemVariants {
pub fn into_token(self) -> Option<String> { pub fn token(self) -> String {
match self { match self {
ContinuationItemVariants::Ep { ContinuationItemVariants::Ep {
continuation_endpoint, continuation_endpoint,
} => continuation_endpoint, } => continuation_endpoint,
ContinuationItemVariants::Btn { button } => button.button_renderer.command, ContinuationItemVariants::Btn { button } => button.button_renderer.command,
} }
.into_token() .continuation_command
.token
} }
} }

View file

@ -2,11 +2,14 @@ use serde::Deserialize;
use serde_with::{ use serde_with::{
rust::deserialize_ignore_any, serde_as, DefaultOnError, DisplayFromStr, VecSkipError, rust::deserialize_ignore_any, serde_as, DefaultOnError, DisplayFromStr, VecSkipError,
}; };
use time::OffsetDateTime; use time::{OffsetDateTime, UtcOffset};
use super::{ChannelBadge, ContentImage, ContinuationItemRenderer, PhMetadataView, Thumbnails}; use super::{
ChannelBadge, ContentImage, ContinuationEndpoint, PhMetadataView, SimpleHeaderRenderer,
Thumbnails,
};
use crate::{ use crate::{
model::{Channel, ChannelItem, ChannelTag, PlaylistItem, VideoItem, YouTubeItem}, model::{Channel, ChannelItem, ChannelTag, HistoryItem, PlaylistItem, VideoItem, YouTubeItem},
param::Language, param::Language,
serializer::{ serializer::{
text::{AttributedText, Text, TextComponent}, text::{AttributedText, Text, TextComponent},
@ -15,11 +18,6 @@ use crate::{
util::{self, timeago, TryRemove}, util::{self, timeago, TryRemove},
}; };
#[cfg(feature = "userdata")]
use crate::{client::response::SimpleHeaderRenderer, model::HistoryItem};
#[cfg(feature = "userdata")]
use time::UtcOffset;
#[serde_as] #[serde_as]
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@ -37,9 +35,12 @@ pub(crate) enum YouTubeListItem {
LockupViewModel(LockupViewModel), LockupViewModel(LockupViewModel),
/// Continuation items are located at the end of a list /// Continauation items are located at the end of a list
/// and contain the continuation token for progressive loading /// and contain the continuation token for progressive loading
ContinuationItemRenderer(ContinuationItemRenderer), #[serde(rename_all = "camelCase")]
ContinuationItemRenderer {
continuation_endpoint: ContinuationEndpoint,
},
/// Corrected search query /// Corrected search query
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@ -65,7 +66,6 @@ pub(crate) enum YouTubeListItem {
/// GridRenderer: contains videos on channel page /// GridRenderer: contains videos on channel page
#[serde(alias = "expandedShelfContentsRenderer", alias = "gridRenderer")] #[serde(alias = "expandedShelfContentsRenderer", alias = "gridRenderer")]
ItemSectionRenderer { ItemSectionRenderer {
#[cfg(feature = "userdata")]
header: Option<ItemSectionHeader>, header: Option<ItemSectionHeader>,
#[serde(alias = "items")] #[serde(alias = "items")]
contents: MapResult<Vec<YouTubeListItem>>, contents: MapResult<Vec<YouTubeListItem>>,
@ -298,7 +298,6 @@ pub(crate) struct YouTubeListRenderer {
pub contents: MapResult<Vec<YouTubeListItem>>, pub contents: MapResult<Vec<YouTubeListItem>>,
} }
#[cfg(feature = "userdata")]
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct ItemSectionHeader { pub(crate) struct ItemSectionHeader {
@ -835,11 +834,9 @@ impl YouTubeListMapper<YouTubeItem> {
self.items.push(mapped); self.items.push(mapped);
} }
} }
YouTubeListItem::ContinuationItemRenderer(r) => { YouTubeListItem::ContinuationItemRenderer {
if self.ctoken.is_none() { continuation_endpoint,
self.ctoken = r.continuation_endpoint.into_token(); } => self.ctoken = Some(continuation_endpoint.continuation_command.token),
}
}
YouTubeListItem::ShowingResultsForRenderer { corrected_query } => { YouTubeListItem::ShowingResultsForRenderer { corrected_query } => {
self.corrected_query = Some(corrected_query); self.corrected_query = Some(corrected_query);
} }
@ -885,11 +882,9 @@ impl YouTubeListMapper<VideoItem> {
self.items.push(mapped); self.items.push(mapped);
} }
} }
YouTubeListItem::ContinuationItemRenderer(r) => { YouTubeListItem::ContinuationItemRenderer {
if self.ctoken.is_none() { continuation_endpoint,
self.ctoken = r.continuation_endpoint.into_token(); } => self.ctoken = Some(continuation_endpoint.continuation_command.token),
}
}
YouTubeListItem::ShowingResultsForRenderer { corrected_query } => { YouTubeListItem::ShowingResultsForRenderer { corrected_query } => {
self.corrected_query = Some(corrected_query); self.corrected_query = Some(corrected_query);
} }
@ -909,7 +904,6 @@ impl YouTubeListMapper<VideoItem> {
res.c.into_iter().for_each(|item| self.map_item(item)); res.c.into_iter().for_each(|item| self.map_item(item));
} }
#[cfg(feature = "userdata")]
pub(crate) fn conv_history_items( pub(crate) fn conv_history_items(
self, self,
date_txt: Option<String>, date_txt: Option<String>,
@ -939,11 +933,9 @@ impl YouTubeListMapper<PlaylistItem> {
self.items.push(mapped); self.items.push(mapped);
} }
} }
YouTubeListItem::ContinuationItemRenderer(r) => { YouTubeListItem::ContinuationItemRenderer {
if self.ctoken.is_none() { continuation_endpoint,
self.ctoken = r.continuation_endpoint.into_token(); } => self.ctoken = Some(continuation_endpoint.continuation_command.token),
}
}
YouTubeListItem::ShowingResultsForRenderer { corrected_query } => { YouTubeListItem::ShowingResultsForRenderer { corrected_query } => {
self.corrected_query = Some(corrected_query); self.corrected_query = Some(corrected_query);
} }

View file

@ -7,7 +7,7 @@ Channel(
name: "EEVblog", name: "EEVblog",
handle: Some("@EEVblog"), handle: Some("@EEVblog"),
subscriber_count: Some(952000), subscriber_count: Some(952000),
video_count: Some(2000), video_count: Some(2),
avatar: [ avatar: [
Thumbnail( Thumbnail(
url: "https://yt3.googleusercontent.com/ytc/AIdro_l17lYcTcRSydZeQK-RuiSfEeH5eX9m4irSNQj6109v5MQ=s72-c-k-c0x00ffffff-no-rj", url: "https://yt3.googleusercontent.com/ytc/AIdro_l17lYcTcRSydZeQK-RuiSfEeH5eX9m4irSNQj6109v5MQ=s72-c-k-c0x00ffffff-no-rj",

View file

@ -7,7 +7,7 @@ Channel(
name: "EEVblog", name: "EEVblog",
handle: Some("@EEVblog"), handle: Some("@EEVblog"),
subscriber_count: Some(933000), subscriber_count: Some(933000),
video_count: Some(1900), video_count: Some(19),
avatar: [ avatar: [
Thumbnail( Thumbnail(
url: "https://yt3.googleusercontent.com/ytc/AIdro_lagjGDfXbXlQXhznx3CDRitOBdxvebllQd_YP1ag=s72-c-k-c0x00ffffff-no-rj", url: "https://yt3.googleusercontent.com/ytc/AIdro_lagjGDfXbXlQXhznx3CDRitOBdxvebllQd_YP1ag=s72-c-k-c0x00ffffff-no-rj",

View file

@ -52,7 +52,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "h3T_NXRUUjM", id: "h3T_NXRUUjM",
@ -85,7 +84,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XZfoFwWvkGQ", id: "XZfoFwWvkGQ",
@ -118,7 +116,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "LOuVxwVFJhs", id: "LOuVxwVFJhs",
@ -151,7 +148,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "GePZUYeIQQQ", id: "GePZUYeIQQQ",
@ -184,7 +180,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0mcING0Zdis", id: "0mcING0Zdis",
@ -214,7 +209,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EAC-2ttHCyk", id: "EAC-2ttHCyk",
@ -244,7 +238,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Bret5VaVzJk", id: "Bret5VaVzJk",
@ -274,7 +267,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EqP1_IcjW-s", id: "EqP1_IcjW-s",
@ -304,7 +296,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3EoF9Of98e4", id: "3EoF9Of98e4",
@ -334,7 +325,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "qr0eN_uIcTs", id: "qr0eN_uIcTs",
@ -364,7 +354,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "McgSyiug6XE", id: "McgSyiug6XE",
@ -398,7 +387,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ioZxvVhjFs8", id: "ioZxvVhjFs8",
@ -428,7 +416,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3jyZJEcomkw", id: "3jyZJEcomkw",
@ -458,7 +445,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9oM-cflYhGk", id: "9oM-cflYhGk",
@ -488,7 +474,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
albums: [ albums: [

View file

@ -67,7 +67,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xTvyyoF_LZY", id: "xTvyyoF_LZY",
@ -100,7 +99,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SlbfAYvA_gI", id: "SlbfAYvA_gI",
@ -133,7 +131,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fdz_cabS9BU", id: "fdz_cabS9BU",
@ -166,7 +163,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hJWSZDJb-W4", id: "hJWSZDJb-W4",
@ -199,7 +195,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fezKpDFKf5U", id: "fezKpDFKf5U",
@ -229,7 +224,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "doGzjheI604", id: "doGzjheI604",
@ -259,7 +253,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zjEdX8-3CD8", id: "zjEdX8-3CD8",
@ -289,7 +282,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DQZcxN9v0RA", id: "DQZcxN9v0RA",
@ -319,7 +311,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2Vv-BfVoq4g", id: "2Vv-BfVoq4g",
@ -349,7 +340,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "JGwWNGJdvx8", id: "JGwWNGJdvx8",
@ -379,7 +369,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nSDgHBxUbVQ", id: "nSDgHBxUbVQ",
@ -409,7 +398,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "lp-EO5I60KA", id: "lp-EO5I60KA",
@ -439,7 +427,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "orJSJGHjBLI", id: "orJSJGHjBLI",
@ -469,7 +456,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Il0S8BoucSA", id: "Il0S8BoucSA",
@ -499,7 +485,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
albums: [ albums: [

View file

@ -67,7 +67,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xTvyyoF_LZY", id: "xTvyyoF_LZY",
@ -100,7 +99,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SlbfAYvA_gI", id: "SlbfAYvA_gI",
@ -133,7 +131,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fdz_cabS9BU", id: "fdz_cabS9BU",
@ -166,7 +163,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hJWSZDJb-W4", id: "hJWSZDJb-W4",
@ -199,7 +195,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fezKpDFKf5U", id: "fezKpDFKf5U",
@ -229,7 +224,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "doGzjheI604", id: "doGzjheI604",
@ -259,7 +253,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zjEdX8-3CD8", id: "zjEdX8-3CD8",
@ -289,7 +282,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DQZcxN9v0RA", id: "DQZcxN9v0RA",
@ -319,7 +311,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2Vv-BfVoq4g", id: "2Vv-BfVoq4g",
@ -349,7 +340,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "JGwWNGJdvx8", id: "JGwWNGJdvx8",
@ -379,7 +369,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nSDgHBxUbVQ", id: "nSDgHBxUbVQ",
@ -409,7 +398,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "lp-EO5I60KA", id: "lp-EO5I60KA",
@ -439,7 +427,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "orJSJGHjBLI", id: "orJSJGHjBLI",
@ -469,7 +456,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Il0S8BoucSA", id: "Il0S8BoucSA",
@ -499,7 +485,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
albums: [ albums: [

View file

@ -67,7 +67,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uZpH7EQ_PwE", id: "uZpH7EQ_PwE",
@ -100,7 +99,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WmQHSkjgyDM", id: "WmQHSkjgyDM",
@ -145,7 +143,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9ssQKlLxBdQ", id: "9ssQKlLxBdQ",
@ -178,7 +175,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "y4FiCl-tUJc", id: "y4FiCl-tUJc",
@ -211,7 +207,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "KSav7HayxtI", id: "KSav7HayxtI",
@ -241,7 +236,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7wtfhZwyrcc", id: "7wtfhZwyrcc",
@ -271,7 +265,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TO-_3tck2tg", id: "TO-_3tck2tg",
@ -301,7 +294,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "D9G1VOjN_84", id: "D9G1VOjN_84",
@ -331,7 +323,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fKopy74weus", id: "fKopy74weus",
@ -361,7 +352,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mWRsgZuwf_8", id: "mWRsgZuwf_8",
@ -391,7 +381,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ktvTqknDobU", id: "ktvTqknDobU",
@ -421,7 +410,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "I-QfPUz1es8", id: "I-QfPUz1es8",
@ -446,7 +434,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0I647GU3Jsc", id: "0I647GU3Jsc",
@ -476,7 +463,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gOsM-DYAEhY", id: "gOsM-DYAEhY",
@ -506,7 +492,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
albums: [ albums: [

View file

@ -67,7 +67,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7_Bav4c7UGM", id: "7_Bav4c7UGM",
@ -100,7 +99,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kzUZABVj5UQ", id: "kzUZABVj5UQ",
@ -133,7 +131,6 @@ MusicArtist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "P5uE7KDkDFE", id: "P5uE7KDkDFE",
@ -163,7 +160,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kxjZwdLWFrc", id: "kxjZwdLWFrc",
@ -193,7 +189,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-aneeaddeXc", id: "-aneeaddeXc",
@ -223,7 +218,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YWijFdsj_Ew", id: "YWijFdsj_Ew",
@ -253,7 +247,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "N217ZuMQnfY", id: "N217ZuMQnfY",
@ -283,7 +276,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "STNyxlYFyVY", id: "STNyxlYFyVY",
@ -313,7 +305,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "v5KZ5dalhzU", id: "v5KZ5dalhzU",
@ -343,7 +334,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vaSSdzgDNw0", id: "vaSSdzgDNw0",
@ -373,7 +363,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Rq_JkcROjsI", id: "Rq_JkcROjsI",
@ -403,7 +392,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5VNZWTzJFso", id: "5VNZWTzJFso",
@ -433,7 +421,6 @@ MusicArtist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
albums: [ albums: [

View file

@ -36,7 +36,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UhbixyxgsiU", id: "UhbixyxgsiU",
@ -66,7 +65,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "saGYMhApaH8", id: "saGYMhApaH8",
@ -96,7 +94,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8n5dJwWXrbo", id: "8n5dJwWXrbo",
@ -126,7 +123,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Cr8K88UcO0s", id: "Cr8K88UcO0s",
@ -156,7 +152,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pfxyk1glEq4", id: "pfxyk1glEq4",
@ -186,7 +181,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VtKcDwz6hiM", id: "VtKcDwz6hiM",
@ -216,7 +210,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aAkMkVFwAoo", id: "aAkMkVFwAoo",
@ -246,7 +239,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3V8aen7Flhs", id: "3V8aen7Flhs",
@ -276,7 +268,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rb0bjyt1OD0", id: "rb0bjyt1OD0",
@ -306,7 +297,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-1vsm5bhoyE", id: "-1vsm5bhoyE",
@ -336,7 +326,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ao3SN7fkQQU", id: "ao3SN7fkQQU",
@ -370,7 +359,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "J9QwBwUnhQo", id: "J9QwBwUnhQo",
@ -400,7 +388,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WyhU6Zb_fhY", id: "WyhU6Zb_fhY",
@ -430,7 +417,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aV-pJ8BBxj8", id: "aV-pJ8BBxj8",
@ -468,7 +454,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gSeBZqcTHLc", id: "gSeBZqcTHLc",
@ -498,7 +483,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Vzkr-G1QEh8", id: "Vzkr-G1QEh8",
@ -528,7 +512,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SK37InR9j38", id: "SK37InR9j38",
@ -562,7 +545,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "C2YSX4sV_bA", id: "C2YSX4sV_bA",
@ -592,7 +574,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ca48oMV59LU", id: "ca48oMV59LU",
@ -622,7 +603,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TUbmIriJlp4", id: "TUbmIriJlp4",
@ -656,7 +636,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Z02zptUN8gI", id: "Z02zptUN8gI",
@ -690,7 +669,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Uq9gPaIzbe8", id: "Uq9gPaIzbe8",
@ -724,7 +702,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "b1kbLwvqugk", id: "b1kbLwvqugk",
@ -754,7 +731,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VF-FGf_ZZiI", id: "VF-FGf_ZZiI",
@ -784,7 +760,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Om0rYw6qzb8", id: "Om0rYw6qzb8",
@ -818,7 +793,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PrSBuEFdRFU", id: "PrSBuEFdRFU",
@ -852,7 +826,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9YdgldMKGGU", id: "9YdgldMKGGU",
@ -882,7 +855,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kiUIkL4aZ5o", id: "kiUIkL4aZ5o",
@ -912,7 +884,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mTkPFsVC5NE", id: "mTkPFsVC5NE",
@ -946,7 +917,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YsMB0i5YTOc", id: "YsMB0i5YTOc",
@ -976,7 +946,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3CkLMG5NwUg", id: "3CkLMG5NwUg",
@ -1006,7 +975,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9yvzvUgzxxg", id: "9yvzvUgzxxg",
@ -1036,7 +1004,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gPCCYMeXin0", id: "gPCCYMeXin0",
@ -1066,7 +1033,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gkkuezo7kX4", id: "gkkuezo7kX4",
@ -1104,7 +1070,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "D2nyu8d7Sq0", id: "D2nyu8d7Sq0",
@ -1134,7 +1099,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SXrcyqCPu4E", id: "SXrcyqCPu4E",
@ -1164,7 +1128,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "p38WgakuYDo", id: "p38WgakuYDo",
@ -1194,7 +1157,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "n4Z1cpdkgQU", id: "n4Z1cpdkgQU",
@ -1224,7 +1186,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4F_vcZ6KD9Q", id: "4F_vcZ6KD9Q",
@ -1254,7 +1215,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
trending_tracks: [ trending_tracks: [
@ -1281,7 +1241,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UhbixyxgsiU", id: "UhbixyxgsiU",
@ -1306,7 +1265,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zugAhfd2r0g", id: "zugAhfd2r0g",
@ -1331,7 +1289,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5jJJYYaw8vw", id: "5jJJYYaw8vw",
@ -1360,7 +1317,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VMZefv4Vrwg", id: "VMZefv4Vrwg",
@ -1385,7 +1341,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3V8aen7Flhs", id: "3V8aen7Flhs",
@ -1410,7 +1365,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rb0bjyt1OD0", id: "rb0bjyt1OD0",
@ -1435,7 +1389,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Ut1OzEVUiM4", id: "Ut1OzEVUiM4",
@ -1460,7 +1413,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rAr3-Pn9yRI", id: "rAr3-Pn9yRI",
@ -1485,7 +1437,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PtPewTyPmUg", id: "PtPewTyPmUg",
@ -1510,7 +1461,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "G6xgMW7U0aY", id: "G6xgMW7U0aY",
@ -1535,7 +1485,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "C2YSX4sV_bA", id: "C2YSX4sV_bA",
@ -1560,7 +1509,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kiUIkL4aZ5o", id: "kiUIkL4aZ5o",
@ -1585,7 +1533,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9YdgldMKGGU", id: "9YdgldMKGGU",
@ -1610,7 +1557,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Z02zptUN8gI", id: "Z02zptUN8gI",
@ -1639,7 +1585,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "S0_888ZjlAA", id: "S0_888ZjlAA",
@ -1664,7 +1609,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "J9QwBwUnhQo", id: "J9QwBwUnhQo",
@ -1689,7 +1633,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DWRj2BB8YHs", id: "DWRj2BB8YHs",
@ -1722,7 +1665,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hX0aI5Jz8i8", id: "hX0aI5Jz8i8",
@ -1747,7 +1689,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Dw9VmOLwxoM", id: "Dw9VmOLwxoM",
@ -1772,7 +1713,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
artists: [ artists: [

View file

@ -32,7 +32,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jEdfjuG0Fx4", id: "jEdfjuG0Fx4",
@ -66,7 +65,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pRpeEdMmmQ0", id: "pRpeEdMmmQ0",
@ -96,7 +94,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Gzs60iBgd3E", id: "Gzs60iBgd3E",
@ -130,7 +127,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "sABN7goDbZ8", id: "sABN7goDbZ8",
@ -164,7 +160,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "saGYMhApaH8", id: "saGYMhApaH8",
@ -194,7 +189,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zuVV9Y55gvc", id: "zuVV9Y55gvc",
@ -228,7 +222,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TiM_TFpT_DE", id: "TiM_TFpT_DE",
@ -258,7 +251,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WcIcVapfqXw", id: "WcIcVapfqXw",
@ -292,7 +284,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Cr8K88UcO0s", id: "Cr8K88UcO0s",
@ -322,7 +313,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BddP6PYo2gs", id: "BddP6PYo2gs",
@ -352,7 +342,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "POe9SOEKotk", id: "POe9SOEKotk",
@ -382,7 +371,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Z02zptUN8gI", id: "Z02zptUN8gI",
@ -416,7 +404,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "e8laLiWolGg", id: "e8laLiWolGg",
@ -458,7 +445,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SK37InR9j38", id: "SK37InR9j38",
@ -492,7 +478,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5kJMtNWUytY", id: "5kJMtNWUytY",
@ -522,7 +507,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gQlMMD8auMs", id: "gQlMMD8auMs",
@ -552,7 +536,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "D0gWr9K8Lb4", id: "D0gWr9K8Lb4",
@ -582,7 +565,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7ouFkoU8Ap8", id: "7ouFkoU8Ap8",
@ -612,7 +594,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-1vsm5bhoyE", id: "-1vsm5bhoyE",
@ -642,7 +623,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gnMdTTeY1FY", id: "gnMdTTeY1FY",
@ -672,7 +652,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ca48oMV59LU", id: "ca48oMV59LU",
@ -702,7 +681,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VtKcDwz6hiM", id: "VtKcDwz6hiM",
@ -732,7 +710,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5g2hT4GmAGU", id: "5g2hT4GmAGU",
@ -762,7 +739,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CQLsdm1ZYAw", id: "CQLsdm1ZYAw",
@ -796,7 +772,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UhbixyxgsiU", id: "UhbixyxgsiU",
@ -826,7 +801,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mxF58TYuPaM", id: "mxF58TYuPaM",
@ -856,7 +830,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8n5dJwWXrbo", id: "8n5dJwWXrbo",
@ -886,7 +859,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "j5y6xLpRwx4", id: "j5y6xLpRwx4",
@ -920,7 +892,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jRxDUsGmwuc", id: "jRxDUsGmwuc",
@ -950,7 +921,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RgKAFK5djSk", id: "RgKAFK5djSk",
@ -980,7 +950,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TGtWWb9emYI", id: "TGtWWb9emYI",
@ -1010,7 +979,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "no0RhhdJMlE", id: "no0RhhdJMlE",
@ -1040,7 +1008,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "dzsuE5ugxf4", id: "dzsuE5ugxf4",
@ -1070,7 +1037,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aAkMkVFwAoo", id: "aAkMkVFwAoo",
@ -1100,7 +1066,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jpYkoa-uE_c", id: "jpYkoa-uE_c",
@ -1138,7 +1103,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "A_g3lMcWVy0", id: "A_g3lMcWVy0",
@ -1172,7 +1136,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gIOyB9ZXn8s", id: "gIOyB9ZXn8s",
@ -1206,7 +1169,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "MwpMEbgC7DA", id: "MwpMEbgC7DA",
@ -1236,7 +1198,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "AJleGCGFyIg", id: "AJleGCGFyIg",
@ -1266,7 +1227,6 @@ MusicCharts(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
trending_tracks: [], trending_tracks: [],

View file

@ -36,7 +36,6 @@ TrackDetails(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
lyrics_id: Some("MPLYt_wrKjTn9hmry"), lyrics_id: Some("MPLYt_wrKjTn9hmry"),
related_id: Some("MPTRt_wrKjTn9hmry"), related_id: Some("MPTRt_wrKjTn9hmry"),

View file

@ -54,7 +54,6 @@ TrackDetails(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
lyrics_id: Some("MPLYt_4xbv14CiQJm-1"), lyrics_id: Some("MPLYt_4xbv14CiQJm-1"),
related_id: Some("MPTRt_4xbv14CiQJm-1"), related_id: Some("MPTRt_4xbv14CiQJm-1"),

View file

@ -38,7 +38,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Y8JFxS1HlDo", id: "Y8JFxS1HlDo",
@ -73,7 +72,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CM4CkVFmTds", id: "CM4CkVFmTds",
@ -108,7 +106,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_ysomCGaZLw", id: "_ysomCGaZLw",
@ -143,7 +140,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gQlMMD8auMs", id: "gQlMMD8auMs",
@ -178,7 +174,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uR8Mrt1IpXg", id: "uR8Mrt1IpXg",
@ -213,7 +208,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PkKnp4SdE-w", id: "PkKnp4SdE-w",
@ -248,7 +242,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4vbDFu0PUew", id: "4vbDFu0PUew",
@ -283,7 +276,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "A5H8zBb3iao", id: "A5H8zBb3iao",
@ -318,7 +310,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_xJUCsyMQes", id: "_xJUCsyMQes",
@ -348,7 +339,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "n0j5NPptyM0", id: "n0j5NPptyM0",
@ -383,7 +373,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3GWscde8rM8", id: "3GWscde8rM8",
@ -418,7 +407,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uBY1AoiF5Vo", id: "uBY1AoiF5Vo",
@ -453,7 +441,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WPdWvnAAurg", id: "WPdWvnAAurg",
@ -488,7 +475,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tyrVtwE8Gv0", id: "tyrVtwE8Gv0",
@ -523,7 +509,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Jh4QFaPmdss", id: "Jh4QFaPmdss",
@ -558,7 +543,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2OvyA2__Eas", id: "2OvyA2__Eas",
@ -593,7 +577,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "dYRITmpFbJ4", id: "dYRITmpFbJ4",
@ -628,7 +611,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "POe9SOEKotk", id: "POe9SOEKotk",
@ -663,7 +645,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pSudEWBAYRE", id: "pSudEWBAYRE",
@ -698,7 +679,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nnVjsos40qk", id: "nnVjsos40qk",
@ -733,7 +713,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "H69tJmsgd9I", id: "H69tJmsgd9I",
@ -768,7 +747,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0IBSemQmno8", id: "0IBSemQmno8",
@ -803,7 +781,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "MjCZfZfucEc", id: "MjCZfZfucEc",
@ -833,7 +810,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tg2uF3R_Ozo", id: "tg2uF3R_Ozo",
@ -868,7 +844,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("CBkSSBILdGcydUYzUl9Pem8iEVJEQU1WTVplZXJybnVMaTVFMg53QUVCOGdFQ2VBRSUzRDgY0AEB-gEQQzcxNUY2RDFGQjIwNEQwQRgKggEVUFQ6RWd0MFp6SjFSak5TWDA5NmJ3"), ctoken: Some("CBkSSBILdGcydUYzUl9Pem8iEVJEQU1WTVplZXJybnVMaTVFMg53QUVCOGdFQ2VBRSUzRDgY0AEB-gEQQzcxNUY2RDFGQjIwNEQwQRgKggEVUFQ6RWd0MFp6SjFSak5TWDA5NmJ3"),

View file

@ -56,7 +56,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "u1uvv_yKhH8", id: "u1uvv_yKhH8",
@ -109,7 +108,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "QiziJ40kTz0", id: "QiziJ40kTz0",
@ -162,7 +160,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OXWz_x6-dro", id: "OXWz_x6-dro",
@ -215,7 +212,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ghrlZIMDzbM", id: "ghrlZIMDzbM",
@ -268,7 +264,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "04tYkKUPPv4", id: "04tYkKUPPv4",
@ -321,7 +316,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "wjCrjR5WpgQ", id: "wjCrjR5WpgQ",
@ -374,7 +368,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "wkVlb8rSies", id: "wkVlb8rSies",
@ -427,7 +420,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RdU3F5vN3_s", id: "RdU3F5vN3_s",
@ -480,7 +472,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "950BdJKBhGo", id: "950BdJKBhGo",
@ -533,7 +524,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "W0x7GcZkvH4", id: "W0x7GcZkvH4",
@ -586,7 +576,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0EK_M2taRIM", id: "0EK_M2taRIM",
@ -639,7 +628,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "INLFlN-PZq4", id: "INLFlN-PZq4",
@ -692,7 +680,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8JXc4idKS_c", id: "8JXc4idKS_c",
@ -745,7 +732,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vFFT1iAUNDE", id: "vFFT1iAUNDE",
@ -802,7 +788,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g92HIac9ufA", id: "g92HIac9ufA",
@ -855,7 +840,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CinJhZF5ZuA", id: "CinJhZF5ZuA",
@ -908,7 +892,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "t7hmovsG_f0", id: "t7hmovsG_f0",
@ -961,7 +944,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "FrEDny55ch8", id: "FrEDny55ch8",
@ -1014,7 +996,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PyyT5tHbOLw", id: "PyyT5tHbOLw",
@ -1067,7 +1048,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_ZkUb7iIOqQ", id: "_ZkUb7iIOqQ",
@ -1120,7 +1100,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UxZH9lRdLD0", id: "UxZH9lRdLD0",
@ -1173,7 +1152,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aYlXNpaQydk", id: "aYlXNpaQydk",
@ -1226,7 +1204,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SZiwpL62to8", id: "SZiwpL62to8",
@ -1279,7 +1256,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mbg1Cn6Ua9U", id: "mbg1Cn6Ua9U",
@ -1332,7 +1308,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("CBkSSBILbWJnMUNuNlVhOVUiEVJEQU1WTTduaWdYUVMxWGIwMg53QUVCOGdFQ2VBRSUzRDgY0AEB-gEQQzcxNUY2RDFGQjIwNEQwQRgKggEVUFQ6RWd0dFltY3hRMjQyVldFNVZR"), ctoken: Some("CBkSSBILbWJnMUNuNlVhOVUiEVJEQU1WTTduaWdYUVMxWGIwMg53QUVCOGdFQ2VBRSUzRDgY0AEB-gEQQzcxNUY2RDFGQjIwNEQwQRgKggEVUFQ6RWd0dFltY3hRMjQyVldFNVZR"),

View file

@ -35,7 +35,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g92HIac9ufA", id: "g92HIac9ufA",
@ -68,7 +67,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "khgCIMs_lVQ", id: "khgCIMs_lVQ",
@ -101,7 +99,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "i2VGa-ETiM4", id: "i2VGa-ETiM4",
@ -134,7 +131,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "INLFlN-PZq4", id: "INLFlN-PZq4",
@ -167,7 +163,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ZzbNM2l-AAA", id: "ZzbNM2l-AAA",
@ -200,7 +195,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "i4loHXi8f3A", id: "i4loHXi8f3A",
@ -233,7 +227,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "miqQAzOXPBo", id: "miqQAzOXPBo",
@ -266,7 +259,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hh5GKVa8VtM", id: "hh5GKVa8VtM",
@ -299,7 +291,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "dzwSnvfKEtw", id: "dzwSnvfKEtw",
@ -332,7 +323,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "REmUidcJt5I", id: "REmUidcJt5I",
@ -365,7 +355,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OXWz_x6-dro", id: "OXWz_x6-dro",
@ -398,7 +387,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aFoqCI75WoY", id: "aFoqCI75WoY",
@ -431,7 +419,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_Pm74XignKI", id: "_Pm74XignKI",
@ -464,7 +451,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-uOShlFu1v8", id: "-uOShlFu1v8",
@ -497,7 +483,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "LP9sF1v-vz4", id: "LP9sF1v-vz4",
@ -530,7 +515,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "KJrPsT2X-yk", id: "KJrPsT2X-yk",
@ -563,7 +547,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tkzYyEp4zB4", id: "tkzYyEp4zB4",
@ -596,7 +579,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ZpD59tu5_Rk", id: "ZpD59tu5_Rk",
@ -629,7 +611,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_eNXeEx9Hvk", id: "_eNXeEx9Hvk",
@ -662,7 +643,6 @@ MusicRelated(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
other_versions: [ other_versions: [
@ -689,7 +669,6 @@ MusicRelated(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Yi2nsnpw5h0", id: "Yi2nsnpw5h0",
@ -714,7 +693,6 @@ MusicRelated(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2Qefh0W_H88", id: "2Qefh0W_H88",
@ -739,7 +717,6 @@ MusicRelated(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "oo89OQvzkIo", id: "oo89OQvzkIo",
@ -764,7 +741,6 @@ MusicRelated(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
albums: [ albums: [

View file

@ -1,5 +1,5 @@
--- ---
source: src/client/music_userdata.rs source: src/client/music_history.rs
expression: map_res.c expression: map_res.c
--- ---
Paginator( Paginator(
@ -37,7 +37,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Today"), playback_date_txt: Some("Today"),
@ -74,7 +73,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Today"), playback_date_txt: Some("Today"),
@ -111,7 +109,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Today"), playback_date_txt: Some("Today"),
@ -148,7 +145,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Today"), playback_date_txt: Some("Today"),
@ -185,7 +181,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Today"), playback_date_txt: Some("Today"),
@ -222,7 +217,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Today"), playback_date_txt: Some("Today"),
@ -263,7 +257,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Today"), playback_date_txt: Some("Today"),
@ -292,7 +285,6 @@ Paginator(
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Today"), playback_date_txt: Some("Today"),
@ -329,7 +321,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -366,7 +357,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -403,7 +393,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -440,7 +429,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -481,7 +469,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -518,7 +505,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -555,7 +541,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -592,7 +577,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -633,7 +617,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -670,7 +653,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -707,7 +689,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -744,7 +725,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -781,7 +761,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -818,7 +797,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),
@ -851,7 +829,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
playback_date: "[date]", playback_date: "[date]",
playback_date_txt: Some("Last week"), playback_date_txt: Some("Last week"),

View file

@ -31,7 +31,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gFERoNpcnFU", id: "gFERoNpcnFU",
@ -61,7 +60,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bmEzom5sfCI", id: "bmEzom5sfCI",
@ -91,7 +89,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "QHY2pm7uT3k", id: "QHY2pm7uT3k",
@ -121,7 +118,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Su42LK7I4NM", id: "Su42LK7I4NM",
@ -151,7 +147,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mly7ha04bEE", id: "mly7ha04bEE",
@ -181,7 +176,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "c91bmLbGt-g", id: "c91bmLbGt-g",
@ -219,7 +213,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "IwzkfMmNMpM", id: "IwzkfMmNMpM",
@ -249,7 +242,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_-spkuonX2k", id: "_-spkuonX2k",
@ -283,7 +275,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "48pBUciAbRY", id: "48pBUciAbRY",
@ -313,6 +304,5 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
] ]

View file

@ -31,7 +31,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_UN2gwabRBI", id: "_UN2gwabRBI",
@ -61,7 +60,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aY72b4ZGPbo", id: "aY72b4ZGPbo",
@ -91,7 +89,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Cu82AvG87_g", id: "Cu82AvG87_g",
@ -121,7 +118,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "p9R94XSYjwI", id: "p9R94XSYjwI",
@ -151,7 +147,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Tlg574e9fuU", id: "Tlg574e9fuU",
@ -181,7 +176,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1L-RpSmlWp0", id: "1L-RpSmlWp0",
@ -211,7 +205,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EI28gmgBMfw", id: "EI28gmgBMfw",
@ -241,7 +234,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Z1DEwM1E7ho", id: "Z1DEwM1E7ho",
@ -275,7 +267,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hqnDi07CsJU", id: "hqnDi07CsJU",
@ -305,7 +296,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_T2tvIwOMfc", id: "_T2tvIwOMfc",
@ -335,7 +325,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "seDc-M7aSOI", id: "seDc-M7aSOI",
@ -365,7 +354,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "APJAQoSCwuA", id: "APJAQoSCwuA",
@ -395,7 +383,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "965Lv2AwODM", id: "965Lv2AwODM",
@ -425,7 +412,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Yl7NAOn0YJw", id: "Yl7NAOn0YJw",
@ -455,7 +441,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TVhoS5qhVi4", id: "TVhoS5qhVi4",
@ -485,7 +470,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "dZdaP7DGze4", id: "dZdaP7DGze4",
@ -515,7 +499,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SsizZ2VZe6c", id: "SsizZ2VZe6c",
@ -545,7 +528,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xFRIddDw8bw", id: "xFRIddDw8bw",
@ -575,7 +557,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Rbhky_2qIUo", id: "Rbhky_2qIUo",
@ -605,7 +586,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ECovqS_ItUo", id: "ECovqS_ItUo",
@ -635,7 +615,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uxP0y-m6ysA", id: "uxP0y-m6ysA",
@ -665,7 +644,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "simC880SUGk", id: "simC880SUGk",
@ -695,7 +673,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "dGLVJ35_gnA", id: "dGLVJ35_gnA",
@ -725,7 +702,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vY6UiUDPuMk", id: "vY6UiUDPuMk",
@ -755,7 +731,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "QMQw_waEPi0", id: "QMQw_waEPi0",
@ -785,7 +760,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Sc2-3BK2mzM", id: "Sc2-3BK2mzM",
@ -819,7 +793,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bprHBlahnmM", id: "bprHBlahnmM",
@ -844,7 +817,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "FMhHc5x2DzE", id: "FMhHc5x2DzE",
@ -874,7 +846,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nOjbJdw2dPs", id: "nOjbJdw2dPs",
@ -904,7 +875,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1G1zcTV5yX4", id: "1G1zcTV5yX4",
@ -934,7 +904,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BcbKoY7XpJE", id: "BcbKoY7XpJE",
@ -964,7 +933,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mq6zggKZTFU", id: "mq6zggKZTFU",
@ -994,7 +962,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aQFl1xhloVo", id: "aQFl1xhloVo",
@ -1024,7 +991,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "A3IhjA2aMUg", id: "A3IhjA2aMUg",
@ -1058,7 +1024,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cxIOWM0xLc4", id: "cxIOWM0xLc4",
@ -1088,7 +1053,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "IFKAgKgVaSI", id: "IFKAgKgVaSI",
@ -1118,7 +1082,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "iGUN99hW3nU", id: "iGUN99hW3nU",
@ -1148,7 +1111,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_alKEACsIds", id: "_alKEACsIds",
@ -1178,7 +1140,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WGNJIF7OoAc", id: "WGNJIF7OoAc",
@ -1208,7 +1169,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "a_TotMZ5hxc", id: "a_TotMZ5hxc",
@ -1242,7 +1202,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0eoeyKkWBRs", id: "0eoeyKkWBRs",
@ -1272,7 +1231,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DU4NtqyTnuM", id: "DU4NtqyTnuM",
@ -1302,7 +1260,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kLbn61Z4LDI", id: "kLbn61Z4LDI",
@ -1332,7 +1289,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vMFNI5lOLwU", id: "vMFNI5lOLwU",
@ -1370,7 +1326,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "AZoZbtI67Yk", id: "AZoZbtI67Yk",
@ -1400,7 +1355,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Ah4Dn3VAnMk", id: "Ah4Dn3VAnMk",
@ -1430,7 +1384,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "sLklEvxhmAQ", id: "sLklEvxhmAQ",
@ -1460,7 +1413,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2Lbp1P4pP6c", id: "2Lbp1P4pP6c",
@ -1490,7 +1442,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2TYIa09PXyo", id: "2TYIa09PXyo",
@ -1520,7 +1471,6 @@ expression: map_res.c
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Hdy7l8fkREo", id: "Hdy7l8fkREo",
@ -1550,7 +1500,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "A-sjPe3xvqY", id: "A-sjPe3xvqY",
@ -1584,7 +1533,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jFVX_v2yAas", id: "jFVX_v2yAas",
@ -1614,7 +1562,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YDfL2Ns8wz4", id: "YDfL2Ns8wz4",
@ -1644,7 +1591,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "du4hVdxqyr8", id: "du4hVdxqyr8",
@ -1674,7 +1620,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "G5vlW0PZ878", id: "G5vlW0PZ878",
@ -1704,7 +1649,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Gtg2TSR19Mg", id: "Gtg2TSR19Mg",
@ -1734,7 +1678,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vJ3wwezOV_8", id: "vJ3wwezOV_8",
@ -1764,7 +1707,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "76q5EiRyYks", id: "76q5EiRyYks",
@ -1794,7 +1736,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nEjntI9GMVM", id: "nEjntI9GMVM",
@ -1824,7 +1765,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Gtct_ipIQmo", id: "Gtct_ipIQmo",
@ -1854,7 +1794,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aw4kqTyZshk", id: "aw4kqTyZshk",
@ -1884,7 +1823,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xjoCNfK3vxo", id: "xjoCNfK3vxo",
@ -1914,7 +1852,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DN1gYO3bu-k", id: "DN1gYO3bu-k",
@ -1939,7 +1876,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "X_cqTeG7v98", id: "X_cqTeG7v98",
@ -1969,7 +1905,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "b_B4ebhKvQ4", id: "b_B4ebhKvQ4",
@ -1999,7 +1934,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VQp1QmwOzxw", id: "VQp1QmwOzxw",
@ -2029,7 +1963,6 @@ expression: map_res.c
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "suAR1PYFNYA", id: "suAR1PYFNYA",
@ -2059,7 +1992,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "No3Cr6ph-9U", id: "No3Cr6ph-9U",
@ -2089,7 +2021,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ORJEgiVY08U", id: "ORJEgiVY08U",
@ -2119,7 +2050,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2px4-y1Y0PI", id: "2px4-y1Y0PI",
@ -2149,7 +2079,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kchzKOizhGg", id: "kchzKOizhGg",
@ -2179,7 +2108,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "V6eAGSz4JI8", id: "V6eAGSz4JI8",
@ -2209,7 +2137,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1A5hWzS00Nc", id: "1A5hWzS00Nc",
@ -2239,7 +2166,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bzsSkarE4zw", id: "bzsSkarE4zw",
@ -2273,7 +2199,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "59HJZIMVxAg", id: "59HJZIMVxAg",
@ -2303,7 +2228,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8XQYz7JKjWI", id: "8XQYz7JKjWI",
@ -2333,7 +2257,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5FkJkpTWSWk", id: "5FkJkpTWSWk",
@ -2371,7 +2294,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1m51ncAU4uA", id: "1m51ncAU4uA",
@ -2405,7 +2327,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Ycff6mFkoPY", id: "Ycff6mFkoPY",
@ -2435,7 +2356,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g0ghPuWqYR0", id: "g0ghPuWqYR0",
@ -2465,7 +2385,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1YiTQJcKajE", id: "1YiTQJcKajE",
@ -2495,7 +2414,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TuyisGsNr4g", id: "TuyisGsNr4g",
@ -2525,7 +2443,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ClU3aqamHGQ", id: "ClU3aqamHGQ",
@ -2555,7 +2472,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bYyB3FzPRfg", id: "bYyB3FzPRfg",
@ -2589,7 +2505,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "I5eu4XMWZR8", id: "I5eu4XMWZR8",
@ -2619,7 +2534,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ziNtA-mcXTY", id: "ziNtA-mcXTY",
@ -2649,7 +2563,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CDEikOST7ZQ", id: "CDEikOST7ZQ",
@ -2683,7 +2596,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YQzvJSR5jy8", id: "YQzvJSR5jy8",
@ -2713,7 +2625,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "lPaplIqUXJc", id: "lPaplIqUXJc",
@ -2743,7 +2654,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "78Y0SxVVxP4", id: "78Y0SxVVxP4",
@ -2773,7 +2683,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2e-xqMWT9GY", id: "2e-xqMWT9GY",
@ -2803,7 +2712,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "81RRIPE404o", id: "81RRIPE404o",
@ -2833,7 +2741,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uxR8VhGG9Pc", id: "uxR8VhGG9Pc",
@ -2863,7 +2770,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "JSNwR0MzGZQ", id: "JSNwR0MzGZQ",
@ -2893,7 +2799,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DS8dvzDXpjQ", id: "DS8dvzDXpjQ",
@ -2923,7 +2828,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "j10zAWP5KsM", id: "j10zAWP5KsM",
@ -2953,7 +2857,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ugFKFWhsoZA", id: "ugFKFWhsoZA",
@ -2983,7 +2886,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xXO1h6Kthcw", id: "xXO1h6Kthcw",
@ -3013,7 +2915,6 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VOUqmbeilXA", id: "VOUqmbeilXA",
@ -3043,6 +2944,5 @@ expression: map_res.c
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
] ]

View file

@ -43,7 +43,6 @@ MusicAlbum(
album_type: single, album_type: single,
year: Some(2020), year: Some(2020),
by_va: false, by_va: false,
track_count: 1,
tracks: [ tracks: [
TrackItem( TrackItem(
id: "XX0epju-YvY", id: "XX0epju-YvY",
@ -69,7 +68,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(1), track_nr: Some(1),
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
variants: [], variants: [],

View file

@ -1,156 +0,0 @@
---
source: src/client/music_playlist.rs
expression: map_res.c
---
MusicAlbum(
id: "MPREb_u1I69lSAe5v",
playlist_id: Some("OLAK5uy_lGP_zv0vJDUlecQDzugUJmjcF7pvyVNyY"),
name: "Waldbrand",
cover: [
Thumbnail(
url: "https://lh3.googleusercontent.com/IYxE8yTIpFUu0OayA5SaxFEn6zQ7T21hpkvI8CODY9NEH1XIhyoUhGohkZuaK-xSu22BC4wjp6srNjIW=w60-h60-l90-rj",
width: 60,
height: 60,
),
Thumbnail(
url: "https://lh3.googleusercontent.com/IYxE8yTIpFUu0OayA5SaxFEn6zQ7T21hpkvI8CODY9NEH1XIhyoUhGohkZuaK-xSu22BC4wjp6srNjIW=w120-h120-l90-rj",
width: 120,
height: 120,
),
Thumbnail(
url: "https://lh3.googleusercontent.com/IYxE8yTIpFUu0OayA5SaxFEn6zQ7T21hpkvI8CODY9NEH1XIhyoUhGohkZuaK-xSu22BC4wjp6srNjIW=w226-h226-l90-rj",
width: 226,
height: 226,
),
Thumbnail(
url: "https://lh3.googleusercontent.com/IYxE8yTIpFUu0OayA5SaxFEn6zQ7T21hpkvI8CODY9NEH1XIhyoUhGohkZuaK-xSu22BC4wjp6srNjIW=w544-h544-l90-rj",
width: 544,
height: 544,
),
],
artists: [
ArtistId(
id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
name: "Madeline Juno",
),
],
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
description: None,
album_type: ep,
year: Some(2016),
by_va: false,
track_count: 5,
tracks: [
TrackItem(
id: "aGd3VKSOTxY",
name: "Ich wache auf",
duration: Some(222),
cover: [],
artists: [
ArtistId(
id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
name: "Madeline Juno",
),
],
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
)),
view_count: Some(208000),
track_type: track,
track_nr: Some(1),
by_va: false,
unavailable: false,
),
TrackItem(
id: "lhPOMUjV4rE",
name: "Waldbrand",
duration: Some(209),
cover: [],
artists: [
ArtistId(
id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
name: "Madeline Juno",
),
],
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
)),
view_count: Some(6000000),
track_type: video,
track_nr: Some(2),
by_va: false,
unavailable: false,
),
TrackItem(
id: "Bu26uFtpt58",
name: "Verlernt",
duration: Some(224),
cover: [],
artists: [
ArtistId(
id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
name: "Madeline Juno",
),
],
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
)),
view_count: Some(418000),
track_type: track,
track_nr: Some(3),
by_va: false,
unavailable: false,
),
TrackItem(
id: "RgwNqqiVqdY",
name: "In Farbe",
duration: Some(222),
cover: [],
artists: [
ArtistId(
id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
name: "Madeline Juno",
),
],
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
)),
view_count: Some(127000),
track_type: track,
track_nr: Some(4),
by_va: false,
unavailable: false,
),
TrackItem(
id: "2TuOh30XbCI",
name: "Stadt im Hinterland",
duration: Some(198),
cover: [],
artists: [
ArtistId(
id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
name: "Madeline Juno",
),
],
artist_id: Some("UCpJyCbFbdTrx0M90HCNBHFQ"),
album: Some(AlbumId(
id: "MPREb_u1I69lSAe5v",
name: "Waldbrand",
)),
view_count: Some(79000),
track_type: track,
track_nr: Some(5),
by_va: false,
unavailable: false,
),
],
variants: [],
)

View file

@ -43,7 +43,6 @@ MusicAlbum(
album_type: album, album_type: album,
year: Some(2015), year: Some(2015),
by_va: false, by_va: false,
track_count: 11,
tracks: [ tracks: [
TrackItem( TrackItem(
id: "YQHsXMglC9A", id: "YQHsXMglC9A",
@ -65,7 +64,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(1), track_nr: Some(1),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fk4BbF7B29w", id: "fk4BbF7B29w",
@ -87,7 +85,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(2), track_nr: Some(2),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "z7NEG3SGZ_g", id: "z7NEG3SGZ_g",
@ -109,7 +106,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(3), track_nr: Some(3),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "a1IuJLebHgM", id: "a1IuJLebHgM",
@ -131,7 +127,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(4), track_nr: Some(4),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-fsCc7Be1H0", id: "-fsCc7Be1H0",
@ -153,7 +148,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(5), track_nr: Some(5),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "l8djdhhFuxo", id: "l8djdhhFuxo",
@ -175,7 +169,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(6), track_nr: Some(6),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Qiu59lZShCo", id: "Qiu59lZShCo",
@ -197,7 +190,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(7), track_nr: Some(7),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-hzFTJDJGkQ", id: "-hzFTJDJGkQ",
@ -219,7 +211,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(8), track_nr: Some(8),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Db9ciJPIaEU", id: "Db9ciJPIaEU",
@ -241,7 +232,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(9), track_nr: Some(9),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jb5g4UFHmfQ", id: "jb5g4UFHmfQ",
@ -263,7 +253,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(10), track_nr: Some(10),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1kZsaRkVEUY", id: "1kZsaRkVEUY",
@ -285,7 +274,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(11), track_nr: Some(11),
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
variants: [], variants: [],

View file

@ -39,7 +39,6 @@ MusicAlbum(
album_type: album, album_type: album,
year: Some(2016), year: Some(2016),
by_va: false, by_va: false,
track_count: 18,
tracks: [ tracks: [
TrackItem( TrackItem(
id: "g0iRiJ_ck48", id: "g0iRiJ_ck48",
@ -61,7 +60,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(1), track_nr: Some(1),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rREEBXp0y9s", id: "rREEBXp0y9s",
@ -83,7 +81,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(2), track_nr: Some(2),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zvU5Y8Q19hU", id: "zvU5Y8Q19hU",
@ -105,7 +102,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(3), track_nr: Some(3),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ARKLrzzTQA0", id: "ARKLrzzTQA0",
@ -127,7 +123,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(4), track_nr: Some(4),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tstLgN8A_Ng", id: "tstLgN8A_Ng",
@ -149,7 +144,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(5), track_nr: Some(5),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "k2DjgQOY3Ts", id: "k2DjgQOY3Ts",
@ -171,7 +165,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(6), track_nr: Some(6),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "azHwhecxEsI", id: "azHwhecxEsI",
@ -193,7 +186,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(7), track_nr: Some(7),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_FcsdYIQ2co", id: "_FcsdYIQ2co",
@ -215,7 +207,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(8), track_nr: Some(8),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "27bOWEbshyE", id: "27bOWEbshyE",
@ -237,7 +228,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(9), track_nr: Some(9),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "riD_3oZwt8w", id: "riD_3oZwt8w",
@ -259,7 +249,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(10), track_nr: Some(10),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8GNvjF3no9s", id: "8GNvjF3no9s",
@ -281,7 +270,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(11), track_nr: Some(11),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YHMFzf1uN2U", id: "YHMFzf1uN2U",
@ -303,7 +291,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(12), track_nr: Some(12),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jvV-z5F3oAo", id: "jvV-z5F3oAo",
@ -325,7 +312,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(13), track_nr: Some(13),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "u8_9cxlrh8k", id: "u8_9cxlrh8k",
@ -347,7 +333,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(14), track_nr: Some(14),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gSvKcvM1Wk0", id: "gSvKcvM1Wk0",
@ -369,7 +354,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(15), track_nr: Some(15),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "wQHgKRJ0pDQ", id: "wQHgKRJ0pDQ",
@ -391,7 +375,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(16), track_nr: Some(16),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Ckz5i6-hzf0", id: "Ckz5i6-hzf0",
@ -413,7 +396,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(17), track_nr: Some(17),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "y5zuUgyFqrc", id: "y5zuUgyFqrc",
@ -435,7 +417,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(18), track_nr: Some(18),
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
variants: [ variants: [

View file

@ -43,7 +43,6 @@ MusicAlbum(
album_type: single, album_type: single,
year: Some(2020), year: Some(2020),
by_va: false, by_va: false,
track_count: 1,
tracks: [ tracks: [
TrackItem( TrackItem(
id: "XX0epju-YvY", id: "XX0epju-YvY",
@ -69,7 +68,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(1), track_nr: Some(1),
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
variants: [], variants: [],

View file

@ -34,7 +34,6 @@ MusicAlbum(
album_type: album, album_type: album,
year: Some(2019), year: Some(2019),
by_va: true, by_va: true,
track_count: 18,
tracks: [ tracks: [
TrackItem( TrackItem(
id: "JWeJHN5P-E8", id: "JWeJHN5P-E8",
@ -56,7 +55,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(1), track_nr: Some(1),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5jd-AhBwcCQ", id: "5jd-AhBwcCQ",
@ -78,7 +76,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(2), track_nr: Some(2),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_cmORZMgv6I", id: "_cmORZMgv6I",
@ -100,7 +97,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(3), track_nr: Some(3),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "M_kVMsFaGYs", id: "M_kVMsFaGYs",
@ -122,7 +118,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(5), track_nr: Some(5),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "c8AfY6yhdkM", id: "c8AfY6yhdkM",
@ -144,7 +139,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(6), track_nr: Some(6),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DSQEKEegiH0", id: "DSQEKEegiH0",
@ -166,7 +160,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(7), track_nr: Some(7),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2TTOKQSzuQY", id: "2TTOKQSzuQY",
@ -188,7 +181,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(8), track_nr: Some(8),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "iRaX0BfME70", id: "iRaX0BfME70",
@ -210,7 +202,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(9), track_nr: Some(9),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Kn3cruxYj0c", id: "Kn3cruxYj0c",
@ -232,7 +223,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(11), track_nr: Some(11),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-P1FyntN_Uc", id: "-P1FyntN_Uc",
@ -254,7 +244,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(12), track_nr: Some(12),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "njdlNT1RRo4", id: "njdlNT1RRo4",
@ -276,7 +265,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(13), track_nr: Some(13),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Si-CXM8CHqQ", id: "Si-CXM8CHqQ",
@ -298,7 +286,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(18), track_nr: Some(18),
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
variants: [], variants: [],

View file

@ -34,7 +34,6 @@ MusicAlbum(
album_type: single, album_type: single,
year: Some(2022), year: Some(2022),
by_va: true, by_va: true,
track_count: 6,
tracks: [ tracks: [
TrackItem( TrackItem(
id: "8IqLxg0GqXc", id: "8IqLxg0GqXc",
@ -56,7 +55,6 @@ MusicAlbum(
track_type: video, track_type: video,
track_nr: Some(1), track_nr: Some(1),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9WYpLYAEub0", id: "9WYpLYAEub0",
@ -78,7 +76,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(2), track_nr: Some(2),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "R48tE237bW4", id: "R48tE237bW4",
@ -100,7 +97,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(3), track_nr: Some(3),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-UzsoR6z-vg", id: "-UzsoR6z-vg",
@ -122,7 +118,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(4), track_nr: Some(4),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kbNVyn8Ex28", id: "kbNVyn8Ex28",
@ -144,7 +139,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(5), track_nr: Some(5),
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "NJrQZUzWP5Y", id: "NJrQZUzWP5Y",
@ -166,7 +160,6 @@ MusicAlbum(
track_type: track, track_type: track,
track_nr: Some(6), track_nr: Some(6),
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
variants: [], variants: [],

View file

@ -59,7 +59,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: None, ctoken: None,

View file

@ -84,7 +84,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "P-zJCLBqZc4", id: "P-zJCLBqZc4",
@ -117,7 +116,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_mAPAtjWZGE", id: "_mAPAtjWZGE",
@ -150,7 +148,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "JbXkjRqWTxc", id: "JbXkjRqWTxc",
@ -187,7 +184,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "72b8D6s_y_U", id: "72b8D6s_y_U",
@ -220,7 +216,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mHKNroJOcig", id: "mHKNroJOcig",
@ -253,7 +248,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0C1NFu4NB_4", id: "0C1NFu4NB_4",
@ -286,7 +280,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EnLWwwtO1-A", id: "EnLWwwtO1-A",
@ -323,7 +316,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cafxLTAWi-g", id: "cafxLTAWi-g",
@ -360,7 +352,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uyemSV1SpnE", id: "uyemSV1SpnE",
@ -393,7 +384,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ogc58xMpPCc", id: "ogc58xMpPCc",
@ -418,7 +408,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tsw1LgVkFjE", id: "tsw1LgVkFjE",
@ -451,7 +440,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xSB8trUFX1A", id: "xSB8trUFX1A",
@ -484,7 +472,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "yEKTrciCvvY", id: "yEKTrciCvvY",
@ -509,7 +496,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "LbHsWjX9dv4", id: "LbHsWjX9dv4",
@ -542,7 +528,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "L2apFB6EF-Y", id: "L2apFB6EF-Y",
@ -575,7 +560,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uCW2sZZofhk", id: "uCW2sZZofhk",
@ -608,7 +592,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XZ9DKiNZszM", id: "XZ9DKiNZszM",
@ -633,7 +616,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "J1AOKFRqCjg", id: "J1AOKFRqCjg",
@ -670,7 +652,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XNd6d6H1LBo", id: "XNd6d6H1LBo",
@ -695,7 +676,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SSy4VdjEJKM", id: "SSy4VdjEJKM",
@ -728,7 +708,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0am_BfODDvc", id: "0am_BfODDvc",
@ -765,7 +744,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xv3qKrCq2w8", id: "xv3qKrCq2w8",
@ -798,7 +776,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pZC82a-2eo0", id: "pZC82a-2eo0",
@ -831,7 +808,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kOmmYiigFLE", id: "kOmmYiigFLE",
@ -864,7 +840,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Jcp48M-vRJw", id: "Jcp48M-vRJw",
@ -897,7 +872,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YeSgtLJQGJs", id: "YeSgtLJQGJs",
@ -930,7 +904,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_LY6aFUVmOU", id: "_LY6aFUVmOU",
@ -967,7 +940,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SCTMdJ1cuoU", id: "SCTMdJ1cuoU",
@ -1000,7 +972,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TEOwoK-CMes", id: "TEOwoK-CMes",
@ -1033,7 +1004,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "JgI6z6aQhEA", id: "JgI6z6aQhEA",
@ -1066,7 +1036,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1FxeCa6kypU", id: "1FxeCa6kypU",
@ -1103,7 +1072,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hG6YzmvbosI", id: "hG6YzmvbosI",
@ -1136,7 +1104,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "y3PKcVd7UtM", id: "y3PKcVd7UtM",
@ -1169,7 +1136,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UiCRuNo4dGg", id: "UiCRuNo4dGg",
@ -1202,7 +1168,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3uXHaVENo6E", id: "3uXHaVENo6E",
@ -1227,7 +1192,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EX2d37tT5fo", id: "EX2d37tT5fo",
@ -1260,7 +1224,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RjQxmy90hTg", id: "RjQxmy90hTg",
@ -1305,7 +1268,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "IsLFK8TkaVw", id: "IsLFK8TkaVw",
@ -1338,7 +1300,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "myRx1SRqxic", id: "myRx1SRqxic",
@ -1371,7 +1332,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BDuDCIt2eiY", id: "BDuDCIt2eiY",
@ -1408,7 +1368,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Do0lH6GDy7w", id: "Do0lH6GDy7w",
@ -1441,7 +1400,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g2oZ6FSl9TU", id: "g2oZ6FSl9TU",
@ -1474,7 +1432,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cHc3cXXIydc", id: "cHc3cXXIydc",
@ -1507,7 +1464,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ITW3C8lIQlk", id: "ITW3C8lIQlk",
@ -1540,7 +1496,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rKGRuQBnatM", id: "rKGRuQBnatM",
@ -1573,7 +1528,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "JstDN42iDDo", id: "JstDN42iDDo",
@ -1610,7 +1564,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "POcbY0NTG9w", id: "POcbY0NTG9w",
@ -1643,7 +1596,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Jf3JOkPsogI", id: "Jf3JOkPsogI",
@ -1680,7 +1632,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "lKLGceNzFAM", id: "lKLGceNzFAM",
@ -1713,7 +1664,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XNupKC5A6jc", id: "XNupKC5A6jc",
@ -1746,7 +1696,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BDWxBtjUyWQ", id: "BDWxBtjUyWQ",
@ -1779,7 +1728,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7LZIEUxH9Ro", id: "7LZIEUxH9Ro",
@ -1812,7 +1760,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5K9y2WGUl0E", id: "5K9y2WGUl0E",
@ -1845,7 +1792,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UzuQCBPpZ7U", id: "UzuQCBPpZ7U",
@ -1882,7 +1828,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SU20Ah4PE48", id: "SU20Ah4PE48",
@ -1915,7 +1860,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3RI2LsrZ9OE", id: "3RI2LsrZ9OE",
@ -1948,7 +1892,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2KoWN3sAFms", id: "2KoWN3sAFms",
@ -1981,7 +1924,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EcHhTnHOzAk", id: "EcHhTnHOzAk",
@ -2014,7 +1956,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "NjjMprtE004", id: "NjjMprtE004",
@ -2047,7 +1988,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gk5sKJ4PgPU", id: "gk5sKJ4PgPU",
@ -2080,7 +2020,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "K81Cfizqe9A", id: "K81Cfizqe9A",
@ -2113,7 +2052,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bM7QN9S0Dno", id: "bM7QN9S0Dno",
@ -2146,7 +2084,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "07O7i2BzqUM", id: "07O7i2BzqUM",
@ -2179,7 +2116,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "m2mJGmMtBfA", id: "m2mJGmMtBfA",
@ -2212,7 +2148,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0gTcGawN9xk", id: "0gTcGawN9xk",
@ -2245,7 +2180,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_tbHFWpYFbA", id: "_tbHFWpYFbA",
@ -2278,7 +2212,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "X2rGbIe14Ys", id: "X2rGbIe14Ys",
@ -2311,7 +2244,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "HIVVqNy5w_g", id: "HIVVqNy5w_g",
@ -2348,7 +2280,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cJH0qBxeBmI", id: "cJH0qBxeBmI",
@ -2373,7 +2304,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "a0C_z75ES4A", id: "a0C_z75ES4A",
@ -2406,7 +2336,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jJQAZKK5_5I", id: "jJQAZKK5_5I",
@ -2439,7 +2368,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "FcBaTjGk5Cg", id: "FcBaTjGk5Cg",
@ -2472,7 +2400,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vwNNfKpGw00", id: "vwNNfKpGw00",
@ -2505,7 +2432,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UKwFZI9zHlY", id: "UKwFZI9zHlY",
@ -2538,7 +2464,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "x62rX6BYeYE", id: "x62rX6BYeYE",
@ -2571,7 +2496,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9BXn7ZNc35Q", id: "9BXn7ZNc35Q",
@ -2608,7 +2532,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "QKYN0pLq1ew", id: "QKYN0pLq1ew",
@ -2641,7 +2564,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "P5Aq3oxynt4", id: "P5Aq3oxynt4",
@ -2674,7 +2596,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tYbZqVBulkU", id: "tYbZqVBulkU",
@ -2707,7 +2628,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "KUpIwlt3TAA", id: "KUpIwlt3TAA",
@ -2740,7 +2660,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nlkNJ4oavoQ", id: "nlkNJ4oavoQ",
@ -2773,7 +2692,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pduHLli6NnA", id: "pduHLli6NnA",
@ -2798,7 +2716,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rbNpTesNEuw", id: "rbNpTesNEuw",
@ -2831,7 +2748,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ecMLL1XKbQA", id: "ecMLL1XKbQA",
@ -2864,7 +2780,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OvfD_geCvkI", id: "OvfD_geCvkI",
@ -2897,7 +2812,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Qg9ea0wi_18", id: "Qg9ea0wi_18",
@ -2930,7 +2844,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "z5bVgD6KjQU", id: "z5bVgD6KjQU",
@ -2967,7 +2880,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UqiemFNeprQ", id: "UqiemFNeprQ",
@ -3000,7 +2912,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1yAcDPQ7bPs", id: "1yAcDPQ7bPs",
@ -3025,7 +2936,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xbHdNkV1Bgg", id: "xbHdNkV1Bgg",
@ -3062,7 +2972,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "AjGbzsAH2dI", id: "AjGbzsAH2dI",
@ -3099,7 +3008,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "29OvRKJlOX4", id: "29OvRKJlOX4",
@ -3132,7 +3040,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "JVUypCxmfQA", id: "JVUypCxmfQA",
@ -3165,7 +3072,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "KWIfPu8860w", id: "KWIfPu8860w",
@ -3198,7 +3104,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "x1DGqCmCeaE", id: "x1DGqCmCeaE",
@ -3231,7 +3136,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Of5EmGLKEn4", id: "Of5EmGLKEn4",
@ -3256,7 +3160,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "T9_p5vicleo", id: "T9_p5vicleo",
@ -3289,7 +3192,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "R_X1K3arztQ", id: "R_X1K3arztQ",
@ -3322,7 +3224,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VTFALCPPUN4", id: "VTFALCPPUN4",
@ -3355,7 +3256,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("4qmFsgJbEi1WTFJEQ0xBSzV1eV9rYjdFQmk2eTNHcnRKcmk0X1pINTZNczc4NkRGRWltYk0aKmVoVlFWRHBGWjNSWFZrVmFRbFJGVGxGVlJsWlBUa0dTQVFNSXVnUSUzRA%3D%3D"), ctoken: Some("4qmFsgJbEi1WTFJEQ0xBSzV1eV9rYjdFQmk2eTNHcnRKcmk0X1pINTZNczc4NkRGRWltYk0aKmVoVlFWRHBGWjNSWFZrVmFRbFJGVGxGVlJsWlBUa0dTQVFNSXVnUSUzRA%3D%3D"),

View file

@ -59,7 +59,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "RPGLMuxkLCs", id: "RPGLMuxkLCs",
@ -84,7 +83,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "z-ALpnnQLrk", id: "z-ALpnnQLrk",
@ -109,7 +107,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "_rrbTTv8zcQ", id: "_rrbTTv8zcQ",
@ -134,7 +131,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "JE16OKTawLw", id: "JE16OKTawLw",
@ -159,7 +155,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "RQNY0Wzm7DQ", id: "RQNY0Wzm7DQ",
@ -184,7 +179,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "uhy24PKBkd0", id: "uhy24PKBkd0",
@ -209,7 +203,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "OL1hQadBHfs", id: "OL1hQadBHfs",
@ -234,7 +227,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "Zge_SUfk0r8", id: "Zge_SUfk0r8",
@ -259,7 +251,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "yFGIeU_IDE4", id: "yFGIeU_IDE4",
@ -284,7 +275,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "P6MVqfQzPIg", id: "P6MVqfQzPIg",
@ -309,7 +299,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "9n0pLDn8Z_I", id: "9n0pLDn8Z_I",
@ -334,7 +323,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "oXbx2YtIkeQ", id: "oXbx2YtIkeQ",
@ -359,7 +347,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "pfBBTTwxo8Q", id: "pfBBTTwxo8Q",
@ -384,7 +371,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "WxtRqzxSAh0", id: "WxtRqzxSAh0",
@ -409,7 +395,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "ianUckvxtLw", id: "ianUckvxtLw",
@ -434,7 +419,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "eb2Ghj1g1ic", id: "eb2Ghj1g1ic",
@ -459,7 +443,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "8TpEsyVtCog", id: "8TpEsyVtCog",
@ -484,7 +467,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "KD_WAei4LMg", id: "KD_WAei4LMg",
@ -509,7 +491,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "qfpOCrtweKk", id: "qfpOCrtweKk",
@ -534,7 +515,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "6gv3nrOA_bQ", id: "6gv3nrOA_bQ",
@ -559,7 +539,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "waaic6UnkU8", id: "waaic6UnkU8",
@ -584,7 +563,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "lSy4MLC_uV4", id: "lSy4MLC_uV4",
@ -609,7 +587,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "BuN8-U_quok", id: "BuN8-U_quok",
@ -634,7 +611,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "g_UTG10nzaQ", id: "g_UTG10nzaQ",
@ -659,7 +635,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "kNykFWaDbGw", id: "kNykFWaDbGw",
@ -684,7 +659,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "gJF7vxCYTgY", id: "gJF7vxCYTgY",
@ -709,7 +683,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "CodZMQ_Anc0", id: "CodZMQ_Anc0",
@ -734,7 +707,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "oKHMTKJdZ_M", id: "oKHMTKJdZ_M",
@ -759,7 +731,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "--O_Eyok_eE", id: "--O_Eyok_eE",
@ -784,7 +755,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "2bT3ljKMSo8", id: "2bT3ljKMSo8",
@ -809,7 +779,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "YRAX_slrbsI", id: "YRAX_slrbsI",
@ -834,7 +803,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "aRRbCEwUSuw", id: "aRRbCEwUSuw",
@ -859,7 +827,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "5sV8SzTbJS8", id: "5sV8SzTbJS8",
@ -884,7 +851,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "ZxxZlU2o1TE", id: "ZxxZlU2o1TE",
@ -909,7 +875,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "gIjo5at4AxE", id: "gIjo5at4AxE",
@ -934,7 +899,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "NSGk7-kyeEU", id: "NSGk7-kyeEU",
@ -959,7 +923,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "cgJtZ7Otc4Y", id: "cgJtZ7Otc4Y",
@ -984,7 +947,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "l5LQu3Q0nWY", id: "l5LQu3Q0nWY",
@ -1009,7 +971,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "YX4Z3ZlWUFc", id: "YX4Z3ZlWUFc",
@ -1034,7 +995,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "LoyvqR41lKw", id: "LoyvqR41lKw",
@ -1059,7 +1019,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "HbQtMZbtx_Q", id: "HbQtMZbtx_Q",
@ -1084,7 +1043,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "0DHRbP9ecgw", id: "0DHRbP9ecgw",
@ -1109,7 +1067,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "rFOFkvk-xus", id: "rFOFkvk-xus",
@ -1134,7 +1091,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "P8zxnSihJ_8", id: "P8zxnSihJ_8",
@ -1159,7 +1115,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "RWgeHl9XkCY", id: "RWgeHl9XkCY",
@ -1184,7 +1139,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "I1n539enNNY", id: "I1n539enNNY",
@ -1209,7 +1163,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "70VKekyZz5g", id: "70VKekyZz5g",
@ -1234,7 +1187,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "2OWJ1bwFu6Y", id: "2OWJ1bwFu6Y",
@ -1259,7 +1211,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "zLiSA2i-niw", id: "zLiSA2i-niw",
@ -1284,7 +1235,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "wyXlw7nMpko", id: "wyXlw7nMpko",
@ -1309,7 +1259,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "NrU4fhzvFpA", id: "NrU4fhzvFpA",
@ -1334,7 +1283,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "1xhKegaA1hQ", id: "1xhKegaA1hQ",
@ -1359,7 +1307,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "9F4lZ8psBtg", id: "9F4lZ8psBtg",
@ -1384,7 +1331,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "G3uUtejX9to", id: "G3uUtejX9to",
@ -1409,7 +1355,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "-0Xn5pViCss", id: "-0Xn5pViCss",
@ -1434,7 +1379,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "a7u71Fco99I", id: "a7u71Fco99I",
@ -1459,7 +1403,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "H6uUbvcgKdk", id: "H6uUbvcgKdk",
@ -1484,7 +1427,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "tPRTCauHtkw", id: "tPRTCauHtkw",
@ -1509,7 +1451,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "pMKAQExcarM", id: "pMKAQExcarM",
@ -1534,7 +1475,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "7E-z-7KCdBI", id: "7E-z-7KCdBI",
@ -1559,7 +1499,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "EPtbC0ZVddo", id: "EPtbC0ZVddo",
@ -1584,7 +1523,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "TpPHng0eGJs", id: "TpPHng0eGJs",
@ -1609,7 +1547,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "rt2QFQwJYcs", id: "rt2QFQwJYcs",
@ -1634,7 +1571,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "WPyfaztFDQ4", id: "WPyfaztFDQ4",
@ -1659,7 +1595,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "5lmumP0DaUw", id: "5lmumP0DaUw",
@ -1684,7 +1619,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
], ],
ctoken: None, ctoken: None,

View file

@ -59,7 +59,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8rRj5ZXRNko", id: "8rRj5ZXRNko",
@ -84,7 +83,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "lHZtcC67yrY", id: "lHZtcC67yrY",
@ -109,7 +107,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TSkVVVBS9k8", id: "TSkVVVBS9k8",
@ -134,7 +131,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "lc-cnCRhE7c", id: "lc-cnCRhE7c",
@ -159,7 +155,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3ryohiCVq3M", id: "3ryohiCVq3M",
@ -184,7 +179,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BNHamTwxJ6Q", id: "BNHamTwxJ6Q",
@ -213,7 +207,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5mqelmYUcI0", id: "5mqelmYUcI0",
@ -238,7 +231,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "k9EYjn5f_nE", id: "k9EYjn5f_nE",
@ -263,7 +255,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fkMg_X9lHMc", id: "fkMg_X9lHMc",
@ -288,7 +279,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4wOoLLDXbDY", id: "4wOoLLDXbDY",
@ -313,7 +303,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Z_mf9aCHag8", id: "Z_mf9aCHag8",
@ -338,7 +327,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cZ58odQo87A", id: "cZ58odQo87A",
@ -363,7 +351,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1il3RFk5Okw", id: "1il3RFk5Okw",
@ -388,7 +375,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8WQMBv2deYQ", id: "8WQMBv2deYQ",
@ -413,7 +399,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vGrfFzagzHs", id: "vGrfFzagzHs",
@ -438,7 +423,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1gDbpWC_9pE", id: "1gDbpWC_9pE",
@ -463,7 +447,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "p-AWcCCbBHw", id: "p-AWcCCbBHw",
@ -488,7 +471,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RPN88D_HjMU", id: "RPN88D_HjMU",
@ -517,7 +499,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5PST7Ld4wWU", id: "5PST7Ld4wWU",
@ -542,7 +523,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "opoDBF_b-fg", id: "opoDBF_b-fg",
@ -567,7 +547,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "AMT9IOyXmBM", id: "AMT9IOyXmBM",
@ -592,7 +571,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VP5B1UmgHfc", id: "VP5B1UmgHfc",
@ -617,7 +595,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vcuQpbs0yT0", id: "vcuQpbs0yT0",
@ -642,7 +619,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "LeMLVEJLruQ", id: "LeMLVEJLruQ",
@ -667,7 +643,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "MtDPKJSsBgc", id: "MtDPKJSsBgc",
@ -692,7 +667,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4tDpYxNYqPg", id: "4tDpYxNYqPg",
@ -717,7 +691,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EkWjaoH7k6w", id: "EkWjaoH7k6w",
@ -742,7 +715,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tERRFWuYG48", id: "tERRFWuYG48",
@ -767,7 +739,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "wCcJuN47UcY", id: "wCcJuN47UcY",
@ -792,7 +763,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "qdtLCfEcPL4", id: "qdtLCfEcPL4",
@ -817,7 +787,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "wjXUBG15eZ8", id: "wjXUBG15eZ8",
@ -842,7 +811,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "HBjDZMJUduo", id: "HBjDZMJUduo",
@ -867,7 +835,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xkXQQ0IAbk0", id: "xkXQQ0IAbk0",
@ -892,7 +859,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DraA3PUuoQc", id: "DraA3PUuoQc",
@ -917,7 +883,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "wMIGQp4YhuU", id: "wMIGQp4YhuU",
@ -942,7 +907,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "38lrK74voaI", id: "38lrK74voaI",
@ -967,7 +931,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2qW9rOSFF1M", id: "2qW9rOSFF1M",
@ -996,7 +959,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tMILH6UEfPA", id: "tMILH6UEfPA",
@ -1021,7 +983,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "izHB2EdMngg", id: "izHB2EdMngg",
@ -1046,7 +1007,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "haECT-SerHk", id: "haECT-SerHk",
@ -1071,7 +1031,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cVikZ8Oe_XA", id: "cVikZ8Oe_XA",
@ -1096,7 +1055,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "drFsXLChrWc", id: "drFsXLChrWc",
@ -1121,7 +1079,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1EMFt7m_8yE", id: "1EMFt7m_8yE",
@ -1146,7 +1103,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_yWU0lFghxU", id: "_yWU0lFghxU",
@ -1171,7 +1127,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XlD-LO3ogFM", id: "XlD-LO3ogFM",
@ -1196,7 +1151,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nAzjWqNfgvc", id: "nAzjWqNfgvc",
@ -1225,7 +1179,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PySC3RGhZJU", id: "PySC3RGhZJU",
@ -1250,7 +1203,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "G-iwLoyH6ZE", id: "G-iwLoyH6ZE",
@ -1275,7 +1227,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fgCOUO-s8nY", id: "fgCOUO-s8nY",
@ -1300,7 +1251,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "m-Ik3yy728Y", id: "m-Ik3yy728Y",
@ -1325,7 +1275,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "U0_UYW5Y4cM", id: "U0_UYW5Y4cM",
@ -1350,7 +1299,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rsrDYTEicq8", id: "rsrDYTEicq8",
@ -1375,7 +1323,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2aU4wRgl_0E", id: "2aU4wRgl_0E",
@ -1400,7 +1347,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "FzcJxJAxFtw", id: "FzcJxJAxFtw",
@ -1429,7 +1375,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2hyibXdOp5w", id: "2hyibXdOp5w",
@ -1454,7 +1399,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YaKG5cUVB30", id: "YaKG5cUVB30",
@ -1479,7 +1423,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Ahwc-ouFeTQ", id: "Ahwc-ouFeTQ",
@ -1504,7 +1447,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SoImFhORKpg", id: "SoImFhORKpg",
@ -1529,7 +1471,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jP4-XrbGt3M", id: "jP4-XrbGt3M",
@ -1554,7 +1495,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Yy2RsG4lnm4", id: "Yy2RsG4lnm4",
@ -1579,7 +1519,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "388e_8mu1t4", id: "388e_8mu1t4",
@ -1604,7 +1543,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "dHHtPi-j7dQ", id: "dHHtPi-j7dQ",
@ -1629,7 +1567,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "d8ERTCVXIUE", id: "d8ERTCVXIUE",
@ -1654,7 +1591,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vQXn3EzzYY4", id: "vQXn3EzzYY4",
@ -1679,7 +1615,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zA-BTpC-yvI", id: "zA-BTpC-yvI",
@ -1704,7 +1639,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rnzIN9H_G10", id: "rnzIN9H_G10",
@ -1729,7 +1663,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fcBbT1GTxqM", id: "fcBbT1GTxqM",
@ -1754,7 +1687,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "wCDsm_dt1cI", id: "wCDsm_dt1cI",
@ -1779,7 +1711,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4j3AOJV1J8I", id: "4j3AOJV1J8I",
@ -1804,7 +1735,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RtuW08ZIgvg", id: "RtuW08ZIgvg",
@ -1829,7 +1759,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cbTXqKBIQ40", id: "cbTXqKBIQ40",
@ -1854,7 +1783,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "oSd0Lph4luY", id: "oSd0Lph4luY",
@ -1879,7 +1807,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "oq0rrYrufYU", id: "oq0rrYrufYU",
@ -1904,7 +1831,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0-P_YkS0z8s", id: "0-P_YkS0z8s",
@ -1929,7 +1855,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4BAKb2p450Q", id: "4BAKb2p450Q",
@ -1954,7 +1879,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "yqObMM_QzVQ", id: "yqObMM_QzVQ",
@ -1979,7 +1903,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "dlvStoOyEzE", id: "dlvStoOyEzE",
@ -2004,7 +1927,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VNttGAaek2U", id: "VNttGAaek2U",
@ -2029,7 +1951,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TxZMfufRJfo", id: "TxZMfufRJfo",
@ -2054,7 +1975,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "6agT2asF4as", id: "6agT2asF4as",
@ -2079,7 +1999,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EcW0n83La5A", id: "EcW0n83La5A",
@ -2104,7 +2023,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_b61hg8UlZM", id: "_b61hg8UlZM",
@ -2129,7 +2047,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kDMFranvFuQ", id: "kDMFranvFuQ",
@ -2154,7 +2071,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1apku0pVDeE", id: "1apku0pVDeE",
@ -2179,7 +2095,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g6JYzOjglBs", id: "g6JYzOjglBs",
@ -2204,7 +2119,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "GYK-NfOo7b4", id: "GYK-NfOo7b4",
@ -2229,7 +2143,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "omUuR45iU0g", id: "omUuR45iU0g",
@ -2254,7 +2167,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "w7BE3inS-NM", id: "w7BE3inS-NM",
@ -2279,7 +2191,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "FM-5BPMnhm0", id: "FM-5BPMnhm0",
@ -2304,7 +2215,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "MnNZNfixTOw", id: "MnNZNfixTOw",
@ -2329,7 +2239,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "qe80EeU8cT8", id: "qe80EeU8cT8",
@ -2354,7 +2263,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-s2-6KYgqpQ", id: "-s2-6KYgqpQ",
@ -2379,7 +2287,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RSlp874hESE", id: "RSlp874hESE",
@ -2408,7 +2315,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "oTI3tRQ_-3k", id: "oTI3tRQ_-3k",
@ -2433,7 +2339,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_okA84gaEJw", id: "_okA84gaEJw",
@ -2458,7 +2363,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pLHnnJRaP7Q", id: "pLHnnJRaP7Q",
@ -2483,7 +2387,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "H2hGrsExuyc", id: "H2hGrsExuyc",
@ -2508,7 +2411,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RsZvjqG2lec", id: "RsZvjqG2lec",
@ -2533,7 +2435,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "qYRCiQ6d35w", id: "qYRCiQ6d35w",
@ -2562,7 +2463,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("4qmFsgI-EiRWTFBMNWREeDY4MVQ0YlI3WkYxSXVXek92MW9tbFJiRTdQaUoaFmVnWlFWRHBEUjFtU0FRTUl1Z1ElM0Q%3D"), ctoken: Some("4qmFsgI-EiRWTFBMNWREeDY4MVQ0YlI3WkYxSXVXek92MW9tbFJiRTdQaUoaFmVnWlFWRHBEUjFtU0FRTUl1Z1ElM0Q%3D"),

View file

@ -59,7 +59,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "RPGLMuxkLCs", id: "RPGLMuxkLCs",
@ -84,7 +83,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "z-ALpnnQLrk", id: "z-ALpnnQLrk",
@ -109,7 +107,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "_rrbTTv8zcQ", id: "_rrbTTv8zcQ",
@ -134,7 +131,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "JE16OKTawLw", id: "JE16OKTawLw",
@ -159,7 +155,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "RQNY0Wzm7DQ", id: "RQNY0Wzm7DQ",
@ -184,7 +179,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "uhy24PKBkd0", id: "uhy24PKBkd0",
@ -209,7 +203,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "OL1hQadBHfs", id: "OL1hQadBHfs",
@ -234,7 +227,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "Zge_SUfk0r8", id: "Zge_SUfk0r8",
@ -259,7 +251,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "yFGIeU_IDE4", id: "yFGIeU_IDE4",
@ -284,7 +275,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "P6MVqfQzPIg", id: "P6MVqfQzPIg",
@ -309,7 +299,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "9n0pLDn8Z_I", id: "9n0pLDn8Z_I",
@ -334,7 +323,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "oXbx2YtIkeQ", id: "oXbx2YtIkeQ",
@ -359,7 +347,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "pfBBTTwxo8Q", id: "pfBBTTwxo8Q",
@ -384,7 +371,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "WxtRqzxSAh0", id: "WxtRqzxSAh0",
@ -409,7 +395,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "ianUckvxtLw", id: "ianUckvxtLw",
@ -434,7 +419,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "eb2Ghj1g1ic", id: "eb2Ghj1g1ic",
@ -459,7 +443,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "8TpEsyVtCog", id: "8TpEsyVtCog",
@ -484,7 +467,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "KD_WAei4LMg", id: "KD_WAei4LMg",
@ -509,7 +491,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "qfpOCrtweKk", id: "qfpOCrtweKk",
@ -534,7 +515,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "6gv3nrOA_bQ", id: "6gv3nrOA_bQ",
@ -559,7 +539,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "waaic6UnkU8", id: "waaic6UnkU8",
@ -584,7 +563,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "lSy4MLC_uV4", id: "lSy4MLC_uV4",
@ -609,7 +587,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "BuN8-U_quok", id: "BuN8-U_quok",
@ -634,7 +611,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "g_UTG10nzaQ", id: "g_UTG10nzaQ",
@ -659,7 +635,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "kNykFWaDbGw", id: "kNykFWaDbGw",
@ -684,7 +659,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "gJF7vxCYTgY", id: "gJF7vxCYTgY",
@ -709,7 +683,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "CodZMQ_Anc0", id: "CodZMQ_Anc0",
@ -734,7 +707,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "oKHMTKJdZ_M", id: "oKHMTKJdZ_M",
@ -759,7 +731,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "--O_Eyok_eE", id: "--O_Eyok_eE",
@ -784,7 +755,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "2bT3ljKMSo8", id: "2bT3ljKMSo8",
@ -809,7 +779,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "YRAX_slrbsI", id: "YRAX_slrbsI",
@ -834,7 +803,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "aRRbCEwUSuw", id: "aRRbCEwUSuw",
@ -859,7 +827,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "5sV8SzTbJS8", id: "5sV8SzTbJS8",
@ -884,7 +851,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "ZxxZlU2o1TE", id: "ZxxZlU2o1TE",
@ -909,7 +875,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "gIjo5at4AxE", id: "gIjo5at4AxE",
@ -934,7 +899,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "NSGk7-kyeEU", id: "NSGk7-kyeEU",
@ -959,7 +923,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "cgJtZ7Otc4Y", id: "cgJtZ7Otc4Y",
@ -984,7 +947,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "l5LQu3Q0nWY", id: "l5LQu3Q0nWY",
@ -1009,7 +971,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "YX4Z3ZlWUFc", id: "YX4Z3ZlWUFc",
@ -1034,7 +995,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "LoyvqR41lKw", id: "LoyvqR41lKw",
@ -1059,7 +1019,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "HbQtMZbtx_Q", id: "HbQtMZbtx_Q",
@ -1084,7 +1043,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "0DHRbP9ecgw", id: "0DHRbP9ecgw",
@ -1109,7 +1067,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "rFOFkvk-xus", id: "rFOFkvk-xus",
@ -1134,7 +1091,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "P8zxnSihJ_8", id: "P8zxnSihJ_8",
@ -1159,7 +1115,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "RWgeHl9XkCY", id: "RWgeHl9XkCY",
@ -1184,7 +1139,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "I1n539enNNY", id: "I1n539enNNY",
@ -1209,7 +1163,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "70VKekyZz5g", id: "70VKekyZz5g",
@ -1234,7 +1187,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "2OWJ1bwFu6Y", id: "2OWJ1bwFu6Y",
@ -1259,7 +1211,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "zLiSA2i-niw", id: "zLiSA2i-niw",
@ -1284,7 +1235,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "wyXlw7nMpko", id: "wyXlw7nMpko",
@ -1309,7 +1259,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "NrU4fhzvFpA", id: "NrU4fhzvFpA",
@ -1334,7 +1283,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "1xhKegaA1hQ", id: "1xhKegaA1hQ",
@ -1359,7 +1307,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "9F4lZ8psBtg", id: "9F4lZ8psBtg",
@ -1384,7 +1331,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "G3uUtejX9to", id: "G3uUtejX9to",
@ -1409,7 +1355,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "-0Xn5pViCss", id: "-0Xn5pViCss",
@ -1434,7 +1379,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "a7u71Fco99I", id: "a7u71Fco99I",
@ -1459,7 +1403,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "H6uUbvcgKdk", id: "H6uUbvcgKdk",
@ -1484,7 +1427,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "tPRTCauHtkw", id: "tPRTCauHtkw",
@ -1509,7 +1451,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "pMKAQExcarM", id: "pMKAQExcarM",
@ -1534,7 +1475,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "7E-z-7KCdBI", id: "7E-z-7KCdBI",
@ -1559,7 +1499,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "EPtbC0ZVddo", id: "EPtbC0ZVddo",
@ -1584,7 +1523,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "TpPHng0eGJs", id: "TpPHng0eGJs",
@ -1609,7 +1547,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "rt2QFQwJYcs", id: "rt2QFQwJYcs",
@ -1634,7 +1571,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "WPyfaztFDQ4", id: "WPyfaztFDQ4",
@ -1659,7 +1595,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "5lmumP0DaUw", id: "5lmumP0DaUw",
@ -1684,7 +1619,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
], ],
ctoken: None, ctoken: None,

View file

@ -61,7 +61,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nBZlrbrBO1I", id: "nBZlrbrBO1I",
@ -86,7 +85,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "AcTDlsUej2w", id: "AcTDlsUej2w",
@ -111,7 +109,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "k6ZoE4RrcDs", id: "k6ZoE4RrcDs",
@ -136,7 +133,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2n5GKLdrTfk", id: "2n5GKLdrTfk",
@ -161,7 +157,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "psuRGfAaju4", id: "psuRGfAaju4",
@ -186,7 +181,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_JGGLJMpVks", id: "_JGGLJMpVks",
@ -211,7 +205,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1YUBbF24H44", id: "1YUBbF24H44",
@ -236,7 +229,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "E0WRQpjckYg", id: "E0WRQpjckYg",
@ -261,7 +253,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mqiH0ZSkM9I", id: "mqiH0ZSkM9I",
@ -286,7 +277,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UAWcs5H-qgQ", id: "UAWcs5H-qgQ",
@ -311,7 +301,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bqO3Y5e4Dow", id: "bqO3Y5e4Dow",
@ -336,7 +325,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ouEezpuPc3A", id: "ouEezpuPc3A",
@ -361,7 +349,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "i-qT5n_5Mys", id: "i-qT5n_5Mys",
@ -386,7 +373,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PMGY8fLwess", id: "PMGY8fLwess",
@ -411,7 +397,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2ebfSItB0oM", id: "2ebfSItB0oM",
@ -436,7 +421,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "c4BLVznuWnU", id: "c4BLVznuWnU",
@ -461,7 +445,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "c0wUKCekI34", id: "c0wUKCekI34",
@ -486,7 +469,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vNfgVjZF8_4", id: "vNfgVjZF8_4",
@ -511,7 +493,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XPpTgCho5ZA", id: "XPpTgCho5ZA",
@ -536,7 +517,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-oqAU5VxFWs", id: "-oqAU5VxFWs",
@ -561,7 +541,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CA1VHbdq5hY", id: "CA1VHbdq5hY",
@ -586,7 +565,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aNzCDt2eidg", id: "aNzCDt2eidg",
@ -611,7 +589,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "A48hOToMuRE", id: "A48hOToMuRE",
@ -636,7 +613,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "qHm9MG9xw1o", id: "qHm9MG9xw1o",
@ -661,7 +637,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "74NhLkjIeMs", id: "74NhLkjIeMs",
@ -686,7 +661,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EptPhiK_q0E", id: "EptPhiK_q0E",
@ -711,7 +685,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "44u7_wQ1s0g", id: "44u7_wQ1s0g",
@ -736,7 +709,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "toOyxylnNkI", id: "toOyxylnNkI",
@ -761,7 +733,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ljXSjIph5ZM", id: "ljXSjIph5ZM",
@ -786,7 +757,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DJFMRLIe-0o", id: "DJFMRLIe-0o",
@ -815,7 +785,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "goqqohUitmw", id: "goqqohUitmw",
@ -840,7 +809,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_LwX7GCE5rI", id: "_LwX7GCE5rI",
@ -865,7 +833,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7KHPC-kEQOA", id: "7KHPC-kEQOA",
@ -894,7 +861,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "26PAgklYYvo", id: "26PAgklYYvo",
@ -919,7 +885,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bO3S8CKafbE", id: "bO3S8CKafbE",
@ -944,7 +909,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tMsbeyeTtpk", id: "tMsbeyeTtpk",
@ -969,7 +933,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fvXn3rmhdc4", id: "fvXn3rmhdc4",
@ -994,7 +957,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2p4n7JgdCsc", id: "2p4n7JgdCsc",
@ -1019,7 +981,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "HtNS1afUOnE", id: "HtNS1afUOnE",
@ -1044,7 +1005,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ufbDvPaVrzs", id: "ufbDvPaVrzs",
@ -1069,7 +1029,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "H1_icnjg6MY", id: "H1_icnjg6MY",
@ -1094,7 +1053,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7Lna4Hu4-AQ", id: "7Lna4Hu4-AQ",
@ -1123,7 +1081,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "K9qu2QMBguw", id: "K9qu2QMBguw",
@ -1156,7 +1113,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uWeqeQkjLto", id: "uWeqeQkjLto",
@ -1181,7 +1137,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "X_ZOGHUWwqE", id: "X_ZOGHUWwqE",
@ -1206,7 +1161,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mHeK0Cwr9sg", id: "mHeK0Cwr9sg",
@ -1231,7 +1185,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0Bf3CJZ4hvg", id: "0Bf3CJZ4hvg",
@ -1256,7 +1209,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7TCncxWNcPU", id: "7TCncxWNcPU",
@ -1281,7 +1233,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PxNYvk_0Onw", id: "PxNYvk_0Onw",
@ -1306,7 +1257,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WLoWBe9BRP4", id: "WLoWBe9BRP4",
@ -1331,7 +1281,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1XYLKoEETVA", id: "1XYLKoEETVA",
@ -1356,7 +1305,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Ghl_vkEV3tc", id: "Ghl_vkEV3tc",
@ -1381,7 +1329,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5qHRMFQ0pLg", id: "5qHRMFQ0pLg",
@ -1406,7 +1353,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "X-vispdELDo", id: "X-vispdELDo",
@ -1431,7 +1377,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "il_L6c_fOvs", id: "il_L6c_fOvs",
@ -1456,7 +1401,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hCjcgoubkPM", id: "hCjcgoubkPM",
@ -1481,7 +1425,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nwXlRq_QyTI", id: "nwXlRq_QyTI",
@ -1506,7 +1449,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ZdsER1S3t8k", id: "ZdsER1S3t8k",
@ -1535,7 +1477,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fyrsExw_LUg", id: "fyrsExw_LUg",
@ -1560,7 +1501,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BS4t017LSoA", id: "BS4t017LSoA",
@ -1593,7 +1533,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0AYzzzBaPBI", id: "0AYzzzBaPBI",
@ -1618,7 +1557,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zM0K3LC7Aak", id: "zM0K3LC7Aak",
@ -1643,7 +1581,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1le0xDbrVj8", id: "1le0xDbrVj8",
@ -1668,7 +1605,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RdFaKz71-5M", id: "RdFaKz71-5M",
@ -1693,7 +1629,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "d6hUByfuhM4", id: "d6hUByfuhM4",
@ -1718,7 +1653,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-uxeu0MbNR0", id: "-uxeu0MbNR0",
@ -1743,7 +1677,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "35VK8yonvsc", id: "35VK8yonvsc",
@ -1768,7 +1701,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ELD3aRzbVQg", id: "ELD3aRzbVQg",
@ -1793,7 +1725,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BD7HwXv18aU", id: "BD7HwXv18aU",
@ -1818,7 +1749,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WJJLfUwIVR4", id: "WJJLfUwIVR4",
@ -1843,7 +1773,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "NjW1S0WIiJw", id: "NjW1S0WIiJw",
@ -1868,7 +1797,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-4szr0EMrgk", id: "-4szr0EMrgk",
@ -1893,7 +1821,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "88NWeOGrxys", id: "88NWeOGrxys",
@ -1926,7 +1853,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BxqtS-7GxFM", id: "BxqtS-7GxFM",
@ -1951,7 +1877,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "KUKt_LbaBnM", id: "KUKt_LbaBnM",
@ -1976,7 +1901,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bhL7A8k6kU8", id: "bhL7A8k6kU8",
@ -2001,7 +1925,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mUN36hFtazE", id: "mUN36hFtazE",
@ -2026,7 +1949,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "dcBZP_pt0uY", id: "dcBZP_pt0uY",
@ -2051,7 +1973,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "m342B1Vv3tM", id: "m342B1Vv3tM",
@ -2076,7 +1997,6 @@ MusicPlaylist(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "N_5RiRBvPSk", id: "N_5RiRBvPSk",
@ -2109,7 +2029,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Q5kH0wg_sKo", id: "Q5kH0wg_sKo",
@ -2142,7 +2061,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "j9zlc5zufl8", id: "j9zlc5zufl8",
@ -2175,7 +2093,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ufxjiU7BgR4", id: "ufxjiU7BgR4",
@ -2208,7 +2125,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7OfB_8rrtug", id: "7OfB_8rrtug",
@ -2241,7 +2157,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UqmvAc81XuM", id: "UqmvAc81XuM",
@ -2274,7 +2189,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "QDULTFB8gSY", id: "QDULTFB8gSY",
@ -2307,7 +2221,6 @@ MusicPlaylist(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: None, ctoken: None,

View file

@ -54,7 +54,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "aZ1hziFhj1o", id: "aZ1hziFhj1o",
@ -87,7 +86,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Album(AlbumItem( Album(AlbumItem(
id: "MPREb_l2IU1O3l6QK", id: "MPREb_l2IU1O3l6QK",
@ -156,7 +154,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "65Q7EdWnjqM", id: "65Q7EdWnjqM",
@ -189,7 +186,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "EL72UcDZLSk", id: "EL72UcDZLSk",
@ -222,7 +218,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "b1kbLwvqugk", id: "b1kbLwvqugk",
@ -247,7 +242,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "3tmd-ClpJxA", id: "3tmd-ClpJxA",
@ -272,7 +266,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "FuXNumBwDOM", id: "FuXNumBwDOM",
@ -297,7 +290,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Album(AlbumItem( Album(AlbumItem(
id: "MPREb_BiCQyyofUtj", id: "MPREb_BiCQyyofUtj",

View file

@ -29,7 +29,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "NU611fxGyPU", id: "NU611fxGyPU",
@ -54,7 +53,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "Yi2nsnpw5h0", id: "Yi2nsnpw5h0",
@ -79,7 +77,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "2Qefh0W_H88", id: "2Qefh0W_H88",
@ -104,7 +101,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "BL-aIpCLWnU", id: "BL-aIpCLWnU",
@ -137,7 +133,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "PpKu3UsHYrk", id: "PpKu3UsHYrk",
@ -170,7 +165,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "jynOfK8JB0E", id: "jynOfK8JB0E",
@ -203,7 +197,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "pgjQkcYD-rQ", id: "pgjQkcYD-rQ",
@ -228,7 +221,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "w2GXdb-pHo8", id: "w2GXdb-pHo8",
@ -253,7 +245,6 @@ MusicSearchResult(
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "JepNreB58TA", id: "JepNreB58TA",
@ -278,7 +269,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Album(AlbumItem( Album(AlbumItem(
id: "MPREb_rR0VQ4fTxPM", id: "MPREb_rR0VQ4fTxPM",
@ -626,7 +616,6 @@ MusicSearchResult(
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "GE0UAdxPTc0", id: "GE0UAdxPTc0",
@ -651,7 +640,6 @@ MusicSearchResult(
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "4gi9y3sTrXE", id: "4gi9y3sTrXE",
@ -676,7 +664,6 @@ MusicSearchResult(
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
User(UserItem( User(UserItem(
id: "UCOeTBeQwhOSvNcaZhxM1PUg", id: "UCOeTBeQwhOSvNcaZhxM1PUg",

View file

@ -67,7 +67,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "Yx-sGL0xX-U", id: "Yx-sGL0xX-U",
@ -100,7 +99,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "HzdD8kbDzZA", id: "HzdD8kbDzZA",
@ -133,7 +131,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "Zh7Un8gVFak", id: "Zh7Un8gVFak",
@ -158,7 +155,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "BMnD36Abw_0", id: "BMnD36Abw_0",
@ -183,7 +179,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Album(AlbumItem( Album(AlbumItem(
id: "MPREb_UQFAF6UM4DN", id: "MPREb_UQFAF6UM4DN",
@ -616,7 +611,6 @@ MusicSearchResult(
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "MiVivWh7zrA", id: "MiVivWh7zrA",
@ -641,7 +635,6 @@ MusicSearchResult(
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "7-hMhhUO8b8", id: "7-hMhhUO8b8",
@ -666,7 +659,6 @@ MusicSearchResult(
track_type: episode, track_type: episode,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
User(UserItem( User(UserItem(
id: "UCdQrWgvHD9f-caMSn3SS-WQ", id: "UCdQrWgvHD9f-caMSn3SS-WQ",

View file

@ -37,7 +37,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "VHLPvrlclmQ", id: "VHLPvrlclmQ",
@ -70,7 +69,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "R9TPed_ohKM", id: "R9TPed_ohKM",
@ -103,7 +101,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "Ej1nxBxFSKc", id: "Ej1nxBxFSKc",
@ -128,7 +125,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "26OrUhkRa3c", id: "26OrUhkRa3c",
@ -153,7 +149,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "Idk-oFqn3kM", id: "Idk-oFqn3kM",
@ -178,7 +173,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Album(AlbumItem( Album(AlbumItem(
id: "MPREb_CYbQPbuAWrt", id: "MPREb_CYbQPbuAWrt",

View file

@ -73,7 +73,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "pt0YvfnhGgI", id: "pt0YvfnhGgI",
@ -106,7 +105,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "0yPnvetCm-U", id: "0yPnvetCm-U",
@ -139,7 +137,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "3ryohiCVq3M", id: "3ryohiCVq3M",
@ -164,7 +161,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "6Bt1KeMNqvc", id: "6Bt1KeMNqvc",
@ -189,7 +185,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Track(TrackItem( Track(TrackItem(
id: "5YQRHUItXTI", id: "5YQRHUItXTI",
@ -214,7 +209,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
Album(AlbumItem( Album(AlbumItem(
id: "MPREb_V5f8YfHKp2j", id: "MPREb_V5f8YfHKp2j",

View file

@ -75,7 +75,6 @@ MusicSearchSuggestion(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
)), )),
], ],
) )

View file

@ -37,7 +37,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cATe8Toht70", id: "cATe8Toht70",
@ -74,7 +73,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0I1UpXSYdOQ", id: "0I1UpXSYdOQ",
@ -107,7 +105,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9G2tG8V5_PY", id: "9G2tG8V5_PY",
@ -140,7 +137,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WwNKyoizf8k", id: "WwNKyoizf8k",
@ -173,7 +169,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kS1o36LXQkc", id: "kS1o36LXQkc",
@ -206,7 +201,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UQQ6L1j6mXE", id: "UQQ6L1j6mXE",
@ -239,7 +233,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9l9dCro-7l8", id: "9l9dCro-7l8",
@ -272,7 +265,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "S_PRpDtgUfI", id: "S_PRpDtgUfI",
@ -305,7 +297,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Xt_ReZc0gnw", id: "Xt_ReZc0gnw",
@ -338,7 +329,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "diN3WCxpqis", id: "diN3WCxpqis",
@ -371,7 +361,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "9q3FfH_57Rc", id: "9q3FfH_57Rc",
@ -404,7 +393,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "U29V08A9yBs", id: "U29V08A9yBs",
@ -441,7 +429,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "HHEKbGlLoEM", id: "HHEKbGlLoEM",
@ -474,7 +461,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "qE_dGvQG1rU", id: "qE_dGvQG1rU",
@ -507,7 +493,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1tyPs3ccT7E", id: "1tyPs3ccT7E",
@ -544,7 +529,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "6pSmQ-MHKbg", id: "6pSmQ-MHKbg",
@ -577,7 +561,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rNsISA-kWzM", id: "rNsISA-kWzM",
@ -610,7 +593,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "AdvPpJVvyEg", id: "AdvPpJVvyEg",
@ -643,7 +625,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7q7o-kjIKpo", id: "7q7o-kjIKpo",
@ -676,7 +657,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("EqQDEgtibGFjayBtYW1iYRqUA0VnV0tBUUlJQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVF0Q1RDMWhTWEJEVEZkdVZZSUJDMk5CVkdVNFZHOW9kRGN3Z2dFTE1Fa3hWWEJZVTFsa1QxR0NBUXM1UnpKMFJ6aFdOVjlRV1lJQkMxZDNUa3Q1YjJsNlpqaHJnZ0VMYTFNeGJ6TTJURmhSYTJPQ0FRdFZVVkUyVERGcU5tMVlSWUlCQ3psc09XUkRjbTh0TjJ3NGdnRUxVMTlRVW5CRWRHZFZaa21DQVF0WWRGOVNaVnBqTUdkdWQ0SUJDMlJwVGpOWFEzaHdjV2x6Z2dFTE9YRXpSbVpJWHpVM1VtT0NBUXRWTWpsV01EaEJPWGxDYzRJQkMwaElSVXRpUjJ4TWIwVk5nZ0VMY1VWZlpFZDJVVWN4Y2xXQ0FRdEVXak14Y0hoNVdXaFNhNElCQ3pad1UyMVJMVTFJUzJKbmdnRUxjazV6U1ZOQkxXdFhlazJDQVF0QlpIWlFjRXBXZG5sRlo0SUJDemR4TjI4dGEycEpTM0J2GPHq0C4%3D"), ctoken: Some("EqQDEgtibGFjayBtYW1iYRqUA0VnV0tBUUlJQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVF0Q1RDMWhTWEJEVEZkdVZZSUJDMk5CVkdVNFZHOW9kRGN3Z2dFTE1Fa3hWWEJZVTFsa1QxR0NBUXM1UnpKMFJ6aFdOVjlRV1lJQkMxZDNUa3Q1YjJsNlpqaHJnZ0VMYTFNeGJ6TTJURmhSYTJPQ0FRdFZVVkUyVERGcU5tMVlSWUlCQ3psc09XUkRjbTh0TjJ3NGdnRUxVMTlRVW5CRWRHZFZaa21DQVF0WWRGOVNaVnBqTUdkdWQ0SUJDMlJwVGpOWFEzaHdjV2x6Z2dFTE9YRXpSbVpJWHpVM1VtT0NBUXRWTWpsV01EaEJPWGxDYzRJQkMwaElSVXRpUjJ4TWIwVk5nZ0VMY1VWZlpFZDJVVWN4Y2xXQ0FRdEVXak14Y0hoNVdXaFNhNElCQ3pad1UyMVJMVTFJUzJKbmdnRUxjazV6U1ZOQkxXdFhlazJDQVF0QlpIWlFjRXBXZG5sRlo0SUJDemR4TjI4dGEycEpTM0J2GPHq0C4%3D"),

View file

@ -41,7 +41,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OJ5ZittaTCk", id: "OJ5ZittaTCk",
@ -74,7 +73,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "H199HKaUk3g", id: "H199HKaUk3g",
@ -107,7 +105,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UlNOkZEcSjQ", id: "UlNOkZEcSjQ",
@ -140,7 +137,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "L61sF-655Zw", id: "L61sF-655Zw",
@ -173,7 +169,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "bOK90e8P3k0", id: "bOK90e8P3k0",
@ -206,7 +201,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "oRHLx2mc2zY", id: "oRHLx2mc2zY",
@ -247,7 +241,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: None, ctoken: None,

View file

@ -37,7 +37,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pt0YvfnhGgI", id: "pt0YvfnhGgI",
@ -70,7 +69,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VinJmH-uidY", id: "VinJmH-uidY",
@ -103,7 +101,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YmSmymHRnEE", id: "YmSmymHRnEE",
@ -136,7 +133,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TgfIbiHCOLo", id: "TgfIbiHCOLo",
@ -169,7 +165,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "lCi6N_uq3vE", id: "lCi6N_uq3vE",
@ -202,7 +197,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "QIjqe2B3RdQ", id: "QIjqe2B3RdQ",
@ -235,7 +229,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "q2pUotlXPeM", id: "q2pUotlXPeM",
@ -268,7 +261,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0yPnvetCm-U", id: "0yPnvetCm-U",
@ -301,7 +293,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EU5Vly60VGU", id: "EU5Vly60VGU",
@ -334,7 +325,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UnxQ0TI4IMs", id: "UnxQ0TI4IMs",
@ -367,7 +357,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ufpny1KxwcU", id: "ufpny1KxwcU",
@ -400,7 +389,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "duzWgZFJNwA", id: "duzWgZFJNwA",
@ -433,7 +421,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "rnXq-1n0lt0", id: "rnXq-1n0lt0",
@ -466,7 +453,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vHkqdC6-rOI", id: "vHkqdC6-rOI",
@ -499,7 +485,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "nTlceSET_b8", id: "nTlceSET_b8",
@ -532,7 +517,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "D8GhmRiIfxI", id: "D8GhmRiIfxI",
@ -565,7 +549,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "01CS-jTaY1U", id: "01CS-jTaY1U",
@ -598,7 +581,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2sKkKKKXO28", id: "2sKkKKKXO28",
@ -631,7 +613,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "czlgl6n9voM", id: "czlgl6n9voM",
@ -664,7 +645,6 @@ MusicSearchResult(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("EqcDEg5saWJsaW5nc21lbnNjaBqUA0VnV0tBUUlJQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVFzMk5EZzFVR2hQZEVoNldZSUJDM0IwTUZsMlptNW9SMmRKZ2dFTFZtbHVTbTFJTFhWcFpGbUNBUXRaYlZOdGVXMUlVbTVGUllJQkMxUm5aa2xpYVVoRFQweHZnZ0VMYkVOcE5rNWZkWEV6ZGtXQ0FRdFJTV3B4WlRKQ00xSmtVWUlCQzNFeWNGVnZkR3hZVUdWTmdnRUxNSGxRYm5abGRFTnRMVldDQVF0RlZUVldiSGsyTUZaSFZZSUJDMVZ1ZUZFd1ZFazBTVTF6Z2dFTGRXWndibmt4UzNoM1kxV0NBUXRrZFhwWFoxcEdTazUzUVlJQkMzSnVXSEV0TVc0d2JIUXdnZ0VMZGtocmNXUkROaTF5VDBtQ0FRdHVWR3hqWlZORlZGOWlPSUlCQzBRNFIyaHRVbWxKWm5oSmdnRUxNREZEVXkxcVZHRlpNVldDQVFzeWMwdHJTMHRMV0U4eU9JSUJDMk42Ykdkc05tNDVkbTlOGPHq0C4%3D"), ctoken: Some("EqcDEg5saWJsaW5nc21lbnNjaBqUA0VnV0tBUUlJQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVFzMk5EZzFVR2hQZEVoNldZSUJDM0IwTUZsMlptNW9SMmRKZ2dFTFZtbHVTbTFJTFhWcFpGbUNBUXRaYlZOdGVXMUlVbTVGUllJQkMxUm5aa2xpYVVoRFQweHZnZ0VMYkVOcE5rNWZkWEV6ZGtXQ0FRdFJTV3B4WlRKQ00xSmtVWUlCQzNFeWNGVnZkR3hZVUdWTmdnRUxNSGxRYm5abGRFTnRMVldDQVF0RlZUVldiSGsyTUZaSFZZSUJDMVZ1ZUZFd1ZFazBTVTF6Z2dFTGRXWndibmt4UzNoM1kxV0NBUXRrZFhwWFoxcEdTazUzUVlJQkMzSnVXSEV0TVc0d2JIUXdnZ0VMZGtocmNXUkROaTF5VDBtQ0FRdHVWR3hqWlZORlZGOWlPSUlCQzBRNFIyaHRVbWxKWm5oSmdnRUxNREZEVXkxcVZHRlpNVldDQVFzeWMwdHJTMHRMV0U4eU9JSUJDMk42Ykdkc05tNDVkbTlOGPHq0C4%3D"),

View file

@ -29,7 +29,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vbl9KrZxOF8", id: "vbl9KrZxOF8",
@ -54,7 +53,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "eMfROJt0a7Q", id: "eMfROJt0a7Q",
@ -79,7 +77,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1ktLEhfkBCI", id: "1ktLEhfkBCI",
@ -104,7 +101,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2hAlp3Khsnk", id: "2hAlp3Khsnk",
@ -129,7 +125,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CHixjhwY0ek", id: "CHixjhwY0ek",
@ -154,7 +149,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8YXKgZ393Ec", id: "8YXKgZ393Ec",
@ -179,7 +173,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "KFNznAXnjXc", id: "KFNznAXnjXc",
@ -204,7 +197,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hDhJeJZmTDA", id: "hDhJeJZmTDA",
@ -229,7 +221,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "6kKSDXiip_8", id: "6kKSDXiip_8",
@ -254,7 +245,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vfzlr70ogaI", id: "vfzlr70ogaI",
@ -279,7 +269,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Fjth6cKGI88", id: "Fjth6cKGI88",
@ -304,7 +293,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fznwvW9Kn4s", id: "fznwvW9Kn4s",
@ -329,7 +317,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Jore0zZW-_M", id: "Jore0zZW-_M",
@ -354,7 +341,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_THM-2Ph-6I", id: "_THM-2Ph-6I",
@ -379,7 +365,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "koJAGIUlnD0", id: "koJAGIUlnD0",
@ -404,7 +389,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4tvQPrHcR4w", id: "4tvQPrHcR4w",
@ -429,7 +413,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CUh6MTvB_4E", id: "CUh6MTvB_4E",
@ -454,7 +437,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4TWR90KJl84", id: "4TWR90KJl84",
@ -479,7 +461,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Cw7eMibV-Xk", id: "Cw7eMibV-Xk",
@ -504,7 +485,6 @@ MusicSearchResult(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("EqQDEgtibGFjayBtYW1iYRqUA0VnV0tBUUlRQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVF0YVpXVnljbTUxVEdrMVJZSUJDM1ppYkRsTGNscDRUMFk0Z2dFTFpVMW1VazlLZERCaE4xR0NBUXN4YTNSTVJXaG1hMEpEU1lJQkN6Sm9RV3h3TTB0b2MyNXJnZ0VMUTBocGVHcG9kMWt3Wld1Q0FRczRXVmhMWjFvek9UTkZZNElCQzB0R1RucHVRVmh1YWxoamdnRUxhRVJvU21WS1dtMVVSRUdDQVFzMmEwdFRSRmhwYVhCZk9JSUJDM1ptZW14eU56QnZaMkZKZ2dFTFJtcDBhRFpqUzBkSk9EaUNBUXRtZW01M2RsYzVTMjQwYzRJQkMwcHZjbVV3ZWxwWExWOU5nZ0VMWDFSSVRTMHlVR2d0TmttQ0FRdHJiMHBCUjBsVmJHNUVNSUlCQ3pSMGRsRlFja2hqVWpSM2dnRUxRMVZvTmsxVWRrSmZORVdDQVFzMFZGZFNPVEJMU213NE5JSUJDME4zTjJWTmFXSldMVmhyGPHq0C4%3D"), ctoken: Some("EqQDEgtibGFjayBtYW1iYRqUA0VnV0tBUUlRQVVnVWFnd1FBeEFFRUFrUURoQUtFQVdDQVF0YVpXVnljbTUxVEdrMVJZSUJDM1ppYkRsTGNscDRUMFk0Z2dFTFpVMW1VazlLZERCaE4xR0NBUXN4YTNSTVJXaG1hMEpEU1lJQkN6Sm9RV3h3TTB0b2MyNXJnZ0VMUTBocGVHcG9kMWt3Wld1Q0FRczRXVmhMWjFvek9UTkZZNElCQzB0R1RucHVRVmh1YWxoamdnRUxhRVJvU21WS1dtMVVSRUdDQVFzMmEwdFRSRmhwYVhCZk9JSUJDM1ptZW14eU56QnZaMkZKZ2dFTFJtcDBhRFpqUzBkSk9EaUNBUXRtZW01M2RsYzVTMjQwYzRJQkMwcHZjbVV3ZWxwWExWOU5nZ0VMWDFSSVRTMHlVR2d0TmttQ0FRdHJiMHBCUjBsVmJHNUVNSUlCQ3pSMGRsRlFja2hqVWpSM2dnRUxRMVZvTmsxVWRrSmZORVdDQVFzMFZGZFNPVEJMU213NE5JSUJDME4zTjJWTmFXSldMVmhyGPHq0C4%3D"),

View file

@ -28,7 +28,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "f9g6NCHQrcE", id: "f9g6NCHQrcE",
@ -57,7 +56,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CAVfEwrwT_o", id: "CAVfEwrwT_o",
@ -86,7 +84,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "VUr9JZQ8F2g", id: "VUr9JZQ8F2g",
@ -111,7 +108,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XQat6rNNbdQ", id: "XQat6rNNbdQ",
@ -136,7 +132,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "EQyU6fGDn0c", id: "EQyU6fGDn0c",
@ -161,7 +156,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g4poKgQZX6w", id: "g4poKgQZX6w",
@ -186,7 +180,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "YTHr7gxwYUQ", id: "YTHr7gxwYUQ",
@ -211,7 +204,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "MfCSDn6q6j4", id: "MfCSDn6q6j4",
@ -236,7 +228,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "gx9KFXb5x_o", id: "gx9KFXb5x_o",
@ -261,7 +252,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "d7R7DQ5tlQo", id: "d7R7DQ5tlQo",
@ -286,7 +276,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cZPjgcqHSa8", id: "cZPjgcqHSa8",
@ -311,7 +300,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ogDLdREonWY", id: "ogDLdREonWY",
@ -336,7 +324,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pRQpKprUUPY", id: "pRQpKprUUPY",
@ -361,7 +348,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "qZoQw9b4uCo", id: "qZoQw9b4uCo",
@ -386,7 +372,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "q23qghoF6Nk", id: "q23qghoF6Nk",
@ -411,7 +396,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "yU0aKa7PFBg", id: "yU0aKa7PFBg",
@ -436,7 +420,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DVCAqvypaCc", id: "DVCAqvypaCc",
@ -461,7 +444,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XdnI7sm6LeQ", id: "XdnI7sm6LeQ",
@ -486,7 +468,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "KcOXNSJtFLg", id: "KcOXNSJtFLg",
@ -511,7 +492,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "K0UxHXZwgsg", id: "K0UxHXZwgsg",
@ -536,7 +516,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "eyyNwOSQ3Yg", id: "eyyNwOSQ3Yg",
@ -561,7 +540,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1yskotqNuXI", id: "1yskotqNuXI",
@ -586,7 +564,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "C03n4AAiL9w", id: "C03n4AAiL9w",
@ -611,7 +588,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "a2wNRTKRusM", id: "a2wNRTKRusM",
@ -636,7 +612,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "AIf61iHwWMQ", id: "AIf61iHwWMQ",
@ -661,7 +636,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BixqbSRjY2Y", id: "BixqbSRjY2Y",
@ -686,7 +660,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Acgy-3d4P6o", id: "Acgy-3d4P6o",
@ -711,7 +684,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5M_yA9M7yNc", id: "5M_yA9M7yNc",
@ -736,7 +708,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PjJuezhos3U", id: "PjJuezhos3U",
@ -761,7 +732,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XMutaJI2-kc", id: "XMutaJI2-kc",
@ -786,7 +756,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Xac6Q7hcZkQ", id: "Xac6Q7hcZkQ",
@ -811,7 +780,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "JfwjsjBcDoU", id: "JfwjsjBcDoU",
@ -836,7 +804,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zshiQUV3ohw", id: "zshiQUV3ohw",
@ -861,7 +828,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g1eTAt1_VAM", id: "g1eTAt1_VAM",
@ -890,7 +856,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "c3rLrFC8igY", id: "c3rLrFC8igY",
@ -915,7 +880,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: true,
), ),
TrackItem( TrackItem(
id: "1im4DNEYzEM", id: "1im4DNEYzEM",
@ -944,7 +908,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8BUxw9ocM2s", id: "8BUxw9ocM2s",
@ -969,7 +932,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g4cSpnGbHPE", id: "g4cSpnGbHPE",
@ -998,7 +960,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1Sdj9MiCowQ", id: "1Sdj9MiCowQ",
@ -1027,7 +988,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2DbR35g-0ZY", id: "2DbR35g-0ZY",
@ -1052,7 +1012,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "j09hpp3AxIE", id: "j09hpp3AxIE",
@ -1077,7 +1036,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "J3GN6JXjV3g", id: "J3GN6JXjV3g",
@ -1102,7 +1060,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "pULl-p02upM", id: "pULl-p02upM",
@ -1127,7 +1084,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "O6By8JeCtQQ", id: "O6By8JeCtQQ",
@ -1152,7 +1108,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "NGn3IYQ7M7E", id: "NGn3IYQ7M7E",
@ -1177,7 +1132,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "o43oI5x86dI", id: "o43oI5x86dI",
@ -1202,7 +1156,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7TNqUrINxzs", id: "7TNqUrINxzs",
@ -1227,7 +1180,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "f3BD5Zm3cp0", id: "f3BD5Zm3cp0",
@ -1256,7 +1208,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "sF4yTDp95Eo", id: "sF4yTDp95Eo",
@ -1281,7 +1232,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1EwLNHg6ejY", id: "1EwLNHg6ejY",
@ -1306,7 +1256,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-l75qaSDWe8", id: "-l75qaSDWe8",
@ -1331,7 +1280,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7h7ntYLLrfQ", id: "7h7ntYLLrfQ",
@ -1356,7 +1304,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ApUl3Ops69M", id: "ApUl3Ops69M",
@ -1381,7 +1328,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2YcJ8Wightw", id: "2YcJ8Wightw",
@ -1406,7 +1352,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "W3q8Od5qJio", id: "W3q8Od5qJio",
@ -1431,7 +1376,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WPFLAjmWCtk", id: "WPFLAjmWCtk",
@ -1456,7 +1400,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tC76tIp0kBk", id: "tC76tIp0kBk",
@ -1481,7 +1424,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kiMG_JV2gbo", id: "kiMG_JV2gbo",
@ -1506,7 +1448,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "CrYYg_atdtk", id: "CrYYg_atdtk",
@ -1531,7 +1472,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XTPGpBBwt1w", id: "XTPGpBBwt1w",
@ -1556,7 +1496,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "uC08L4xxjNM", id: "uC08L4xxjNM",
@ -1581,7 +1520,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5fAoV_AAMf0", id: "5fAoV_AAMf0",
@ -1606,7 +1544,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "u5Vz7obL460", id: "u5Vz7obL460",
@ -1631,7 +1568,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ZPJlyRv_IGI", id: "ZPJlyRv_IGI",
@ -1656,7 +1592,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "s2SLbln-JwE", id: "s2SLbln-JwE",
@ -1681,7 +1616,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "28xHtRw6pG8", id: "28xHtRw6pG8",
@ -1706,7 +1640,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "joWoKqUTRvc", id: "joWoKqUTRvc",
@ -1731,7 +1664,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "XNMFTqhcNrE", id: "XNMFTqhcNrE",
@ -1756,7 +1688,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "v3vPLgJ9FX8", id: "v3vPLgJ9FX8",
@ -1785,7 +1716,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UFXOd179kOA", id: "UFXOd179kOA",
@ -1810,7 +1740,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4xRsDnKgHZc", id: "4xRsDnKgHZc",
@ -1835,7 +1764,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "mE3IjoEqMqY", id: "mE3IjoEqMqY",
@ -1860,7 +1788,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "E7e5vxKerqA", id: "E7e5vxKerqA",
@ -1885,7 +1812,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "axmZ_5Rx4Go", id: "axmZ_5Rx4Go",
@ -1910,7 +1836,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "44Ig6BsOCYA", id: "44Ig6BsOCYA",
@ -1935,7 +1860,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "3iLBFEJjdN0", id: "3iLBFEJjdN0",
@ -1960,7 +1884,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "M-ncq2eHF_k", id: "M-ncq2eHF_k",
@ -1985,7 +1908,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-AJoJ-ggiKI", id: "-AJoJ-ggiKI",
@ -2010,7 +1932,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "cgb-zp9DDHg", id: "cgb-zp9DDHg",
@ -2039,7 +1960,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Q7ZXg3KQLt0", id: "Q7ZXg3KQLt0",
@ -2064,7 +1984,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ysAEZOwp5rM", id: "ysAEZOwp5rM",
@ -2089,7 +2008,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "m5vfng33SVE", id: "m5vfng33SVE",
@ -2114,7 +2032,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "yMfgjVlGbUE", id: "yMfgjVlGbUE",
@ -2139,7 +2056,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OQIYEPe6DWY", id: "OQIYEPe6DWY",
@ -2164,7 +2080,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "5FS8RIH7BpI", id: "5FS8RIH7BpI",
@ -2189,7 +2104,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "zSRKgFB9piY", id: "zSRKgFB9piY",
@ -2214,7 +2128,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "e4eHhgwHCME", id: "e4eHhgwHCME",
@ -2243,7 +2156,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "q3hZvho7jNk", id: "q3hZvho7jNk",
@ -2268,7 +2180,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0nWysyj_Z4Y", id: "0nWysyj_Z4Y",
@ -2293,7 +2204,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "aGCcLWU0OVo", id: "aGCcLWU0OVo",
@ -2318,7 +2228,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OQsXLK4MeEA", id: "OQsXLK4MeEA",
@ -2343,7 +2252,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "xm7dxIqOO2M", id: "xm7dxIqOO2M",
@ -2368,7 +2276,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "jlaaByab4Zk", id: "jlaaByab4Zk",
@ -2397,7 +2304,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "KG9-jSqXz4U", id: "KG9-jSqXz4U",
@ -2422,7 +2328,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "7dISZnwsBSA", id: "7dISZnwsBSA",
@ -2447,7 +2352,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "F_PPdS-PB14", id: "F_PPdS-PB14",
@ -2472,7 +2376,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DMg9idvVY8M", id: "DMg9idvVY8M",
@ -2497,7 +2400,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DGEmoSFI94Y", id: "DGEmoSFI94Y",
@ -2522,7 +2424,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "BtZufymxHvE", id: "BtZufymxHvE",
@ -2551,7 +2452,6 @@ Paginator(
track_type: video, track_type: video,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("4qmFsgI8EiRWTFBMNWREeDY4MVQ0YlI3WkYxSXVXek92MW9tbFJiRTdQaUoaFGVnZFFWRHBEVGtGQ2tnRURDTG9F"), ctoken: Some("4qmFsgI8EiRWTFBMNWREeDY4MVQ0YlI3WkYxSXVXek92MW9tbFJiRTdQaUoaFGVnZFFWRHBEVGtGQ2tnRURDTG9F"),

View file

@ -56,7 +56,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hh5GKVa8VtM", id: "hh5GKVa8VtM",
@ -109,7 +108,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RdU3F5vN3_s", id: "RdU3F5vN3_s",
@ -162,7 +160,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OXWz_x6-dro", id: "OXWz_x6-dro",
@ -215,7 +212,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ghrlZIMDzbM", id: "ghrlZIMDzbM",
@ -268,7 +264,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "QiziJ40kTz0", id: "QiziJ40kTz0",
@ -321,7 +316,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "950BdJKBhGo", id: "950BdJKBhGo",
@ -374,7 +368,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "tkzYyEp4zB4", id: "tkzYyEp4zB4",
@ -427,7 +420,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ffqliB42Nh4", id: "ffqliB42Nh4",
@ -480,7 +472,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vFFT1iAUNDE", id: "vFFT1iAUNDE",
@ -537,7 +528,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8JXc4idKS_c", id: "8JXc4idKS_c",
@ -590,7 +580,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4JJFrjkRxmo", id: "4JJFrjkRxmo",
@ -643,7 +632,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0EK_M2taRIM", id: "0EK_M2taRIM",
@ -696,7 +684,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "04tYkKUPPv4", id: "04tYkKUPPv4",
@ -749,7 +736,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "W0x7GcZkvH4", id: "W0x7GcZkvH4",
@ -802,7 +788,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "INLFlN-PZq4", id: "INLFlN-PZq4",
@ -855,7 +840,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "GhL8GUjXEfk", id: "GhL8GUjXEfk",
@ -908,7 +892,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "TaZkqPK0sbw", id: "TaZkqPK0sbw",
@ -965,7 +948,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ogKU5EQ0Wn0", id: "ogKU5EQ0Wn0",
@ -1018,7 +1000,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "g92HIac9ufA", id: "g92HIac9ufA",
@ -1071,7 +1052,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_E6gDU0m_hk", id: "_E6gDU0m_hk",
@ -1124,7 +1104,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "FrEDny55ch8", id: "FrEDny55ch8",
@ -1177,7 +1156,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "-uOShlFu1v8", id: "-uOShlFu1v8",
@ -1230,7 +1208,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "PyyT5tHbOLw", id: "PyyT5tHbOLw",
@ -1283,7 +1260,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("CBkSSBILUHl5VDV0SGJPTHciEVJEQU1WTTduaWdYUVMxWGIwMg53QUVCOGdFQ2VBRSUzRDgY0AEB-gEQQzcxNUY2RDFGQjIwNEQwQRgKggEVUFQ6RWd0UWVYbFVOWFJJWWs5TWR3"), ctoken: Some("CBkSSBILUHl5VDV0SGJPTHciEVJEQU1WTTduaWdYUVMxWGIwMg53QUVCOGdFQ2VBRSUzRDgY0AEB-gEQQzcxNUY2RDFGQjIwNEQwQRgKggEVUFQ6RWd0UWVYbFVOWFJJWWs5TWR3"),

View file

@ -36,7 +36,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "0uSu-jHdDd4", id: "0uSu-jHdDd4",
@ -69,7 +68,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "11pkE_azpBQ", id: "11pkE_azpBQ",
@ -102,7 +100,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "1tJPy7XlfCQ", id: "1tJPy7XlfCQ",
@ -135,7 +132,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "2JpUBTLjfPA", id: "2JpUBTLjfPA",
@ -168,7 +164,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "6WiuMIp9B6Y", id: "6WiuMIp9B6Y",
@ -201,7 +196,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "8nfNNAlsTTA", id: "8nfNNAlsTTA",
@ -234,7 +228,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "C1U6oXpz4As", id: "C1U6oXpz4As",
@ -267,7 +260,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "DvKw0jTUN-s", id: "DvKw0jTUN-s",
@ -300,7 +292,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "GDSVX--bsRU", id: "GDSVX--bsRU",
@ -333,7 +324,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "I-ArzgPbNx8", id: "I-ArzgPbNx8",
@ -366,7 +356,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OElgvIuT8TY", id: "OElgvIuT8TY",
@ -399,7 +388,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "RGlOEBJyhrc", id: "RGlOEBJyhrc",
@ -432,7 +420,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "UUCM1WR611g", id: "UUCM1WR611g",
@ -465,7 +452,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "WlzrZsEtWbs", id: "WlzrZsEtWbs",
@ -498,7 +484,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "apY7iYoYtD8", id: "apY7iYoYtD8",
@ -531,7 +516,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "azSEPwrxG2c", id: "azSEPwrxG2c",
@ -564,7 +548,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "b9FNHTk-tAM", id: "b9FNHTk-tAM",
@ -597,7 +580,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "eAeGr78VYxM", id: "eAeGr78VYxM",
@ -630,7 +612,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "efCzrXOWM0Q", id: "efCzrXOWM0Q",
@ -663,7 +644,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "fbmHQLiF1qs", id: "fbmHQLiF1qs",
@ -696,7 +676,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "h0qhAXLom-Y", id: "h0qhAXLom-Y",
@ -729,7 +708,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hTL2vAvAbNM", id: "hTL2vAvAbNM",
@ -762,7 +740,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "hptOG4EVgMs", id: "hptOG4EVgMs",
@ -795,7 +772,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "iRIlHsC8xL8", id: "iRIlHsC8xL8",
@ -828,7 +804,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("4qmFsgJcEhRGRW11c2ljX2xpa2VkX3ZpZGVvcxpEQ0JwNkprTkNhMUZIVW05SlEwRkZVVUZvYjBOYVZ6UnBSRUZxWXpsaVF6ZENhRU4yT1ZwdFRVRjNnZ01HS2dRSUFCQUI%3D"), ctoken: Some("4qmFsgJcEhRGRW11c2ljX2xpa2VkX3ZpZGVvcxpEQ0JwNkprTkNhMUZIVW05SlEwRkZVVUZvYjBOYVZ6UnBSRUZxWXpsaVF6ZENhRU4yT1ZwdFRVRjNnZ01HS2dRSUFCQUI%3D"),

View file

@ -36,7 +36,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "vMZqNPZADFw", id: "vMZqNPZADFw",
@ -69,7 +68,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "C8B-nBnB7Bk", id: "C8B-nBnB7Bk",
@ -102,7 +100,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "29MOu6Y781I", id: "29MOu6Y781I",
@ -135,7 +132,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "AdvPpJVvyEg", id: "AdvPpJVvyEg",
@ -168,7 +164,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "kv3Z269PQvE", id: "kv3Z269PQvE",
@ -201,7 +196,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "y74ZqAkFkK4", id: "y74ZqAkFkK4",
@ -234,7 +228,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "ZVnqAUnj-1Y", id: "ZVnqAUnj-1Y",
@ -267,7 +260,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "REmUidcJt5I", id: "REmUidcJt5I",
@ -300,7 +292,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "63sEilefjtQ", id: "63sEilefjtQ",
@ -333,7 +324,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_LGy1K5vmq8", id: "_LGy1K5vmq8",
@ -366,7 +356,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Ak98OIfed8o", id: "Ak98OIfed8o",
@ -399,7 +388,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "_aSqdZKxcuU", id: "_aSqdZKxcuU",
@ -432,7 +420,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "6Lb4bmEEfnY", id: "6Lb4bmEEfnY",
@ -465,7 +452,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "4lrp5FWFIak", id: "4lrp5FWFIak",
@ -498,7 +484,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "Kk8vT1o_gYE", id: "Kk8vT1o_gYE",
@ -539,7 +524,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "FbUrY0GdO88", id: "FbUrY0GdO88",
@ -572,7 +556,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "OFesVwAdT80", id: "OFesVwAdT80",
@ -605,7 +588,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "lNeJjPPKE1g", id: "lNeJjPPKE1g",
@ -638,7 +620,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
TrackItem( TrackItem(
id: "SW_woyyA1Bg", id: "SW_woyyA1Bg",
@ -671,7 +652,6 @@ Paginator(
track_type: track, track_type: track,
track_nr: None, track_nr: None,
by_va: false, by_va: false,
unavailable: false,
), ),
], ],
ctoken: Some("EqQDEgtibGFjayBtYW1iYRqUA0VnV0tBUUlJQVVnb2Fnd1FBeEFFRUFrUURoQUtFQVdDQVF0eVRuTkpVMEV0YTFkNlRZSUJDM1pOV25GT1VGcEJSRVozZ2dFTFF6aENMVzVDYmtJM1FtdUNBUXN5T1UxUGRUWlpOemd4U1lJQkMwRmtkbEJ3U2xaMmVVVm5nZ0VMYTNZeldqSTJPVkJSZGtXQ0FRdDVOelJhY1VGclJtdExOSUlCQzFwV2JuRkJWVzVxTFRGWmdnRUxVa1Z0Vldsa1kwcDBOVW1DQVFzMk0zTkZhV3hsWm1wMFVZSUJDMTlNUjNreFN6VjJiWEU0Z2dFTFFXczVPRTlKWm1Wa09HLUNBUXRmWVZOeFpGcExlR04xVllJQkN6Wk1ZalJpYlVWRlptNVpnZ0VMTkd4eWNEVkdWMFpKWVd1Q0FRdExhemgyVkRGdlgyZFpSWUlCQzBaaVZYSlpNRWRrVHpnNGdnRUxUMFpsYzFaM1FXUlVPRENDQVF0c1RtVkthbEJRUzBVeFo0SUJDMU5YWDNkdmVYbEJNVUpuGPHq0C4%3D"), ctoken: Some("EqQDEgtibGFjayBtYW1iYRqUA0VnV0tBUUlJQVVnb2Fnd1FBeEFFRUFrUURoQUtFQVdDQVF0eVRuTkpVMEV0YTFkNlRZSUJDM1pOV25GT1VGcEJSRVozZ2dFTFF6aENMVzVDYmtJM1FtdUNBUXN5T1UxUGRUWlpOemd4U1lJQkMwRmtkbEJ3U2xaMmVVVm5nZ0VMYTNZeldqSTJPVkJSZGtXQ0FRdDVOelJhY1VGclJtdExOSUlCQzFwV2JuRkJWVzVxTFRGWmdnRUxVa1Z0Vldsa1kwcDBOVW1DQVFzMk0zTkZhV3hsWm1wMFVZSUJDMTlNUjNreFN6VjJiWEU0Z2dFTFFXczVPRTlKWm1Wa09HLUNBUXRmWVZOeFpGcExlR04xVllJQkN6Wk1ZalJpYlVWRlptNVpnZ0VMTkd4eWNEVkdWMFpKWVd1Q0FRdExhemgyVkRGdlgyZFpSWUlCQzBaaVZYSlpNRWRrVHpnNGdnRUxUMFpsYzFaM1FXUlVPRENDQVF0c1RtVkthbEJRUzBVeFo0SUJDMU5YWDNkdmVYbEJNVUpuGPHq0C4%3D"),

View file

@ -208,10 +208,11 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
) )
}); });
let comment_ctoken = comment_ctoken_section.and_then(|s| { let comment_ctoken = comment_ctoken_section.map(|s| {
s.continuation_item_renderer s.continuation_item_renderer
.continuation_endpoint .continuation_endpoint
.into_token() .continuation_command
.token
}); });
let (owner, description, is_ccommons) = match secondary_info { let (owner, description, is_ccommons) = match secondary_info {
@ -332,7 +333,7 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
.sub_menu_items; .sub_menu_items;
items items
.try_swap_remove(1) .try_swap_remove(1)
.and_then(|c| c.service_endpoint.into_token()) .map(|c| c.service_endpoint.continuation_command.token)
}); });
Ok(MapResult { Ok(MapResult {
@ -452,9 +453,7 @@ impl MapResponse<Paginator<Comment>> for response::VideoComments {
} }
} }
response::video_details::CommentListItem::ContinuationItemRenderer(cont) => { response::video_details::CommentListItem::ContinuationItemRenderer(cont) => {
if ctoken.is_none() { ctoken = Some(cont.token());
ctoken = cont.into_token();
}
} }
response::video_details::CommentListItem::CommentsHeaderRenderer { count_text } => { response::video_details::CommentListItem::CommentsHeaderRenderer { count_text } => {
comment_count = count_text comment_count = count_text
@ -521,9 +520,7 @@ fn map_replies(
)) ))
} }
response::video_details::CommentListItem::ContinuationItemRenderer(cont) => { response::video_details::CommentListItem::ContinuationItemRenderer(cont) => {
if reply_ctoken.is_none() { reply_ctoken = Some(cont.token());
reply_ctoken = cont.into_token();
}
None None
} }
_ => None, _ => None,

View file

@ -3,7 +3,7 @@ use std::collections::HashMap;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use regex::Regex; use regex::Regex;
use reqwest::Client; use reqwest::Client;
use ress::tokens::{Keyword, Punct, Token}; use ress::tokens::Token;
use rquickjs::{Context, Runtime}; use rquickjs::{Context, Runtime};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -39,7 +39,7 @@ impl DeobfData {
if let Err(e) = &res { if let Err(e) = &res {
if let Some(reporter) = reporter { if let Some(reporter) = reporter {
let report = Report { let report = Report {
info: RustyPipeInfo::new(None, None), info: RustyPipeInfo::new(None),
level: Level::ERR, level: Level::ERR,
operation: "extract_deobf", operation: "extract_deobf",
error: Some(e.to_string()), error: Some(e.to_string()),
@ -106,7 +106,7 @@ impl Deobfuscator {
.with(|ctx| call_fn(&ctx, DEOBF_NSIG_FUNC_NAME, nsig))?; .with(|ctx| call_fn(&ctx, DEOBF_NSIG_FUNC_NAME, nsig))?;
tracing::trace!("deobf nsig: {nsig} -> {res}"); tracing::trace!("deobf nsig: {nsig} -> {res}");
if res.starts_with("enhanced_except_") || res.ends_with(nsig) { if res.starts_with("enhanced_except_") || res.ends_with(nsig) {
return Err(DeobfError::Other("nsig fn returned an exception".into())); return Err(DeobfError::Other("nsig fn returned an exception"));
} }
Ok(res) Ok(res)
} }
@ -134,21 +134,55 @@ fn caller_function(mapped_name: &str, fn_name: &str) -> String {
} }
fn get_sig_fn(player_js: &str) -> Result<String, DeobfError> { fn get_sig_fn(player_js: &str) -> Result<String, DeobfError> {
let name = get_sig_fn_name(player_js)?; let dfunc_name = get_sig_fn_name(player_js)?;
let code = extract_js_fn(player_js, &name)?;
let js_fn = format!("{}{}", code, caller_function(DEOBF_SIG_FUNC_NAME, &name));
let function_pattern_str = format!(
r#"({}=function\([\w]+\)\{{.+?\}})"#,
dfunc_name.replace('$', "\\$")
);
let function_pattern = Regex::new(&function_pattern_str)
.map_err(|_| DeobfError::Other("could not parse sig fn pattern regex"))?;
let deobfuscate_function = format!(
"var {};",
&function_pattern
.captures(player_js)
.ok_or(DeobfError::Extraction("sig fn"))?[1]
);
let helper_object_name_pattern = Regex::new(r";([\w\$]{2,3})\...\(").unwrap();
let helper_object_name = helper_object_name_pattern
.captures(&deobfuscate_function)
.ok_or(DeobfError::Extraction("sig fn helper object name"))?
.get(1)
.unwrap()
.as_str();
let helper_pattern_str = format!(
r#"(var {}=\{{.+?\}}\}};)"#,
helper_object_name.replace('$', "\\$")
);
let helper_pattern = Regex::new(&helper_pattern_str)
.map_err(|_| DeobfError::Other("could not parse helper pattern regex"))?;
let player_js_nonl = player_js.replace('\n', "");
let helper_object = &helper_pattern
.captures(&player_js_nonl)
.ok_or(DeobfError::Extraction("sig fn helper object"))?[1];
let js_fn = helper_object.to_owned()
+ &deobfuscate_function
+ &caller_function(DEOBF_SIG_FUNC_NAME, &dfunc_name);
tracing::trace!("sig_fn: {js_fn}"); tracing::trace!("sig_fn: {js_fn}");
verify_fn(&js_fn, DEOBF_SIG_FUNC_NAME)?; verify_fn(&js_fn, DEOBF_SIG_FUNC_NAME)?;
tracing::debug!("successfully extracted sig fn `{name}`"); tracing::debug!("successfully extracted sig fn `{dfunc_name}`");
Ok(js_fn) Ok(js_fn)
} }
fn get_nsig_fn_names(player_js: &str) -> impl Iterator<Item = String> + '_ { fn get_nsig_fn_names(player_js: &str) -> impl Iterator<Item = String> + '_ {
static FUNCTION_NAME_REGEX: Lazy<Regex> = Lazy::new(|| { static FUNCTION_NAME_REGEX: Lazy<Regex> = Lazy::new(|| {
// ( ==="index.m3u8" OR "index.m3u8"=== ) .. delete .. y=functionName[array_num](z) // x.get( .. y=functionName[array_num](z) .. x.set(
Regex::new(r#"(?:(?:===(?:[\w$]+\[\d+\]|"index\.m3u8"))|(?:(?:[\w$]+\[\d+\]|"index\.m3u8")===)).+\bdelete\b.+\b[a-zA-Z]=([\w$]{2,})(?:\[(\d+)\])?\([a-zA-Z0-9]\)"#) Regex::new(r#"(?:[\w$]\.get\(|index\.m3u8).+[a-zA-Z]=([\w$]{2,})(?:\[(\d+)\])?\([a-zA-Z0-9]\).+[a-zA-Z0-9]\.set\("#)
.unwrap() .unwrap()
}); });
@ -172,71 +206,26 @@ fn get_nsig_fn_names(player_js: &str) -> impl Iterator<Item = String> + '_ {
}) })
} }
fn extract_js_fn(js: &str, name: &str) -> Result<String, DeobfError> { fn extract_js_fn(js: &str, offset: usize, name: &str) -> Result<String, DeobfError> {
let function_base_re = Regex::new(&format!(r#"{}\s*=\s*function\("#, regex::escape(name)))
.map_err(|e| DeobfError::Other(format!("parsing regex for {name}: {e}").into()))?;
let offset = function_base_re
.find(js)
.ok_or(DeobfError::Extraction("could not find function base"))?
.start();
let scan = ress::Scanner::new(&js[offset..]); let scan = ress::Scanner::new(&js[offset..]);
let mut state = 0; let mut state = 0;
let mut level = 0;
#[derive(Default, Clone, PartialEq, Eq)] let mut start = 0;
struct Level { let mut end = 0;
brace: isize,
paren: isize,
bracket: isize,
}
let mut level = Level::default();
let mut start = 0usize;
let mut end = 0usize;
let mut period_before = false; let mut period_before = false;
let mut function_before = false; let mut last_ident = None;
let mut idents: HashMap<String, bool> = HashMap::new(); let mut idents: HashMap<String, usize> = HashMap::new();
// Set if the current statement is a variable/function param definition
// First value is the brace level, second is true if we are on the right hand side of an assignment
let mut var_def_stmt: Option<(Level, bool)> = None;
let global_objects = [ let global_objects = [
"globalThis", "NaN", "Infinity", "Object", "Function", "Boolean", "Symbol", "Error", "Number", "BigInt",
"NaN", "Math", "Date", "String", "RegExp", "Array", "Map", "Set",
"undefined",
"Infinity",
"Object",
"Function",
"Boolean",
"Symbol",
"Error",
"Number",
"BigInt",
"Math",
"Date",
"String",
"RegExp",
"Array",
"Map",
"Set",
"eval",
"isFinite",
"isNaN",
"parseFloat",
"parseInt",
"decodeURI",
"decodeURIComponent",
"encodeURI",
"encodeURIComponent",
"escape",
"unescape",
]; ];
for item in scan { for item in scan {
let it = item?; let it = item?;
let token = it.token; let token = it.token;
match state { match state {
// Looking for fn name // Looking for fn name
0 => { 0 => {
@ -247,113 +236,47 @@ fn extract_js_fn(js: &str, name: &str) -> Result<String, DeobfError> {
} }
// Looking for equals // Looking for equals
1 => { 1 => {
if token.matches_punct(Punct::Equal) { if token.matches_punct(ress::tokens::Punct::Equal) {
state = 2; state = 2;
} else { } else {
state = 0; state = 0;
} }
} }
2 => { 2 => {
match &token { // Looking for begin/end braces
Token::Punct(punct) => { if token.matches_punct(ress::tokens::Punct::OpenBrace) {
let var_def_this_lvl = || { level += 1;
var_def_stmt } else if token.matches_punct(ress::tokens::Punct::CloseBrace) {
.as_ref() level -= 1;
.map(|(x, _)| x == &level)
.unwrap_or_default()
};
match punct { if level == 0 {
Punct::OpenBrace => {
level.brace += 1;
}
Punct::CloseBrace => {
if var_def_this_lvl() {
var_def_stmt = None;
}
level.brace -= 1;
if level.brace == 0 {
end = it.span.end; end = it.span.end;
state = 3; state = 3;
break; break;
} }
} }
Punct::OpenParen => {
level.paren += 1; // Looking for variable names
} if let Token::Ident(id) = &token {
Punct::CloseParen => { if !period_before {
if var_def_this_lvl() { let id_str = id.to_string();
var_def_stmt = None; if !global_objects.contains(&id_str.as_str()) {
} last_ident = Some(id.to_string());
level.paren -= 1;
}
Punct::OpenBracket => {
level.bracket += 1;
}
Punct::CloseBracket => {
if var_def_this_lvl() {
var_def_stmt = None;
}
level.bracket -= 1;
}
Punct::SemiColon => {
if var_def_this_lvl() {
var_def_stmt = None;
} }
} }
Punct::Comma => { } else if last_ident.is_some()
if let Some((lvl, rhs)) = &mut var_def_stmt { && !token.matches_punct(ress::tokens::Punct::OpenParen)
if lvl == &level {
*rhs = false;
}
}
}
Punct::Equal => {
if let Some((lvl, rhs)) = &mut var_def_stmt {
if lvl == &level {
*rhs = true;
}
}
}
_ => {}
}
}
Token::Keyword(kw) => match kw {
Keyword::Var(_) | Keyword::Let(_) | Keyword::Const(_) => {
var_def_stmt = Some((level.clone(), false));
}
Keyword::Function(_) => {
let mut l = level.clone();
l.paren += 1;
var_def_stmt = Some((l, false));
}
_ => {}
},
Token::Ident(id) => {
// Ignore object attributes
if !period_before && !global_objects.contains(&id.as_ref()) {
// If we are on the left hand side of a variable definition statement
// or after "function", mark the variable name as defined
if var_def_stmt
.as_ref()
.map(|(lvl, rhs)| lvl == &level && !rhs)
.unwrap_or_default()
|| function_before
{ {
idents.insert(id.to_string(), true); let n = idents.entry(last_ident.unwrap()).or_default();
*n += 1;
last_ident = None;
} else { } else {
idents.entry(id.to_string()).or_default(); last_ident = None;
}
}
}
_ => {}
} }
} }
_ => break, _ => break,
}; };
period_before = token.matches_punct(Punct::Period); period_before = token.matches_punct(ress::tokens::Punct::Period);
function_before = matches!(&token, Token::Keyword(Keyword::Function(_)));
} }
if state != 3 { if state != 3 {
@ -364,10 +287,9 @@ fn extract_js_fn(js: &str, name: &str) -> Result<String, DeobfError> {
let mut code = format!("var {};", &js[fn_range.clone()]); let mut code = format!("var {};", &js[fn_range.clone()]);
let rt = rquickjs::Runtime::new()?; let rt = rquickjs::Runtime::new()?;
for (ident, _) in idents.into_iter().filter(|(_, v)| !v) { for (ident, _) in idents.into_iter().filter(|(_, v)| *v == 1) {
let var_pattern_str = format!(r#"(^|[^\w$\.]){}\s*=[^=]"#, regex::escape(&ident)); let var_pattern_str = format!(r#"(^|[^\w$]){}\s*=[^=]"#, regex::escape(&ident));
let re = Regex::new(&var_pattern_str) let re = Regex::new(&var_pattern_str).unwrap();
.map_err(|e| DeobfError::Other(format!("parsing regex for {ident}: {e}").into()))?;
let found_variable = re let found_variable = re
.captures_iter(js) .captures_iter(js)
.filter(|cap| { .filter(|cap| {
@ -425,13 +347,13 @@ fn extract_js_var(js: &str) -> Option<&str> {
if let Token::Punct(p) = &token { if let Token::Punct(p) = &token {
match p { match p {
Punct::OpenBrace => braces.push(b'{'), ress::tokens::Punct::OpenBrace => braces.push(b'{'),
Punct::OpenBracket => braces.push(b'['), ress::tokens::Punct::OpenBracket => braces.push(b'['),
Punct::OpenParen => braces.push(b'('), ress::tokens::Punct::OpenParen => braces.push(b'('),
Punct::CloseBrace => close_brace(&mut braces, b'{')?, ress::tokens::Punct::CloseBrace => close_brace(&mut braces, b'{')?,
Punct::CloseBracket => close_brace(&mut braces, b'[')?, ress::tokens::Punct::CloseBracket => close_brace(&mut braces, b'[')?,
Punct::CloseParen => close_brace(&mut braces, b'(')?, ress::tokens::Punct::CloseParen => close_brace(&mut braces, b'(')?,
Punct::Comma | Punct::SemiColon => { ress::tokens::Punct::Comma | ress::tokens::Punct::SemiColon => {
if braces.is_empty() { if braces.is_empty() {
end = it.span.start; end = it.span.start;
break; break;
@ -466,19 +388,23 @@ fn verify_fn(js_fn: &str, fn_name: &str) -> Result<(), DeobfError> {
})?; })?;
if res.is_empty() { if res.is_empty() {
return Err(DeobfError::Other( return Err(DeobfError::Other("deobfuscation fn returned empty string"));
"deobfuscation fn returned empty string".into(),
));
} }
if res.starts_with("enhanced_except_") || res.ends_with(&testinp) { if res.starts_with("enhanced_except_") || res.ends_with(&testinp) {
return Err(DeobfError::Other("nsig fn returned an exception".into())); return Err(DeobfError::Other("nsig fn returned an exception"));
} }
Ok(()) Ok(())
} }
fn get_nsig_fn(player_js: &str) -> Result<String, DeobfError> { fn get_nsig_fn(player_js: &str) -> Result<String, DeobfError> {
let extract_fn = |name: &str| -> Result<String, DeobfError> { let extract_fn = |name: &str| -> Result<String, DeobfError> {
let code = extract_js_fn(player_js, name)?; let function_base = format!("{name}=function");
let offset = player_js
.find(&function_base)
.ok_or(DeobfError::Extraction("could not find function base"))?;
let code = extract_js_fn(player_js, offset, name)?;
let js_fn = format!("{}{}", code, caller_function(DEOBF_NSIG_FUNC_NAME, name)); let js_fn = format!("{}{}", code, caller_function(DEOBF_NSIG_FUNC_NAME, name));
tracing::trace!("nsig_fn: {js_fn}"); tracing::trace!("nsig_fn: {js_fn}");
verify_fn(&js_fn, DEOBF_NSIG_FUNC_NAME)?; verify_fn(&js_fn, DEOBF_NSIG_FUNC_NAME)?;
@ -546,9 +472,7 @@ mod tests {
std::fs::read_to_string(js_path).unwrap() std::fs::read_to_string(js_path).unwrap()
}); });
const SIG_DEOBF_FUNC: &str = r#"var qB={w8:function(a){a.reverse()}, const SIG_DEOBF_FUNC: &str = r#"var qB={w8:function(a){a.reverse()},EC:function(a,b){var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c},Np:function(a,b){a.splice(0,b)}};var Rva=function(a){a=a.split("");qB.Np(a,3);qB.w8(a,41);qB.EC(a,55);qB.Np(a,3);qB.w8(a,33);qB.Np(a,3);qB.EC(a,48);qB.EC(a,17);qB.EC(a,43);return a.join("")};var deobf_sig=Rva;"#;
EC:function(a,b){var c=a[0];a[0]=a[b%a.length];a[b%a.length]=c},
Np:function(a,b){a.splice(0,b)}}; var Rva=function(a){a=a.split("");qB.Np(a,3);qB.w8(a,41);qB.EC(a,55);qB.Np(a,3);qB.w8(a,33);qB.Np(a,3);qB.EC(a,48);qB.EC(a,17);qB.EC(a,43);return a.join("")};var deobf_sig=Rva;"#;
const NSIG_DEOBF_FUNC: &str = r#"var Vo=function(a){var b=a.split(""),c=[function(d,e,f){var h=f.length;d.forEach(function(l,m,n){this.push(n[m]=f[(f.indexOf(l)-f.indexOf(this[m])+m+h--)%f.length])},e.split(""))}, const NSIG_DEOBF_FUNC: &str = r#"var Vo=function(a){var b=a.split(""),c=[function(d,e,f){var h=f.length;d.forEach(function(l,m,n){this.push(n[m]=f[(f.indexOf(l)-f.indexOf(this[m])+m+h--)%f.length])},e.split(""))},
928409064,-595856984,1403221911,653089124,-168714481,-1883008765,158931990,1346921902,361518508,1403221911,-362174697,-233641452,function(){for(var d=64,e=[];++d-e.length-32;){switch(d){case 91:d=44;continue;case 123:d=65;break;case 65:d-=18;continue;case 58:d=96;continue;case 46:d=95}e.push(String.fromCharCode(d))}return e}, 928409064,-595856984,1403221911,653089124,-168714481,-1883008765,158931990,1346921902,361518508,1403221911,-362174697,-233641452,function(){for(var d=64,e=[];++d-e.length-32;){switch(d){case 91:d=44;continue;case 123:d=65;break;case 65:d-=18;continue;case 58:d=96;continue;case 46:d=95}e.push(String.fromCharCode(d))}return e},
b,158931990,791141857,-907319795,-1776185924,1595027902,-829736173,function(d,e){e=(e%d.length+d.length)%d.length;d.splice(0,1,d.splice(e,1,d[0])[0])}, b,158931990,791141857,-907319795,-1776185924,1595027902,-829736173,function(d,e){e=(e%d.length+d.length)%d.length;d.splice(0,1,d.splice(e,1,d[0])[0])},
@ -601,7 +525,7 @@ c[36](c[8],c[32]),c[20](c[25],c[10]),c[2](c[22],c[8]),c[32](c[20],c[16]),c[32](c
#[test] #[test]
fn t_extract_js_fn() { fn t_extract_js_fn() {
let base_js = "Wka = function(d){let x=10/2;return /,,[/,913,/](,)}/}let a = 42;"; let base_js = "Wka = function(d){let x=10/2;return /,,[/,913,/](,)}/}let a = 42;";
let res = extract_js_fn(base_js, "Wka").unwrap(); let res = extract_js_fn(base_js, 0, "Wka").unwrap();
assert_eq!( assert_eq!(
res, res,
"var Wka = function(d){let x=10/2;return /,,[/,913,/](,)}/};" "var Wka = function(d){let x=10/2;return /,,[/,913,/](,)}/};"
@ -612,7 +536,7 @@ c[36](c[8],c[32]),c[20](c[25],c[10]),c[2](c[22],c[8]),c[32](c[20],c[16]),c[32](c
fn t_extract_js_fn_eviljs() { fn t_extract_js_fn_eviljs() {
// Evil JavaScript code containing braces within strings and regular expressions // Evil JavaScript code containing braces within strings and regular expressions
let base_js = "Wka = function(d){var x = [/,,/,913,/(,)}/,\"abcdef}\\\"\",];var y = 10/2/1;return x[1][y];}//some={}random-padding+;"; let base_js = "Wka = function(d){var x = [/,,/,913,/(,)}/,\"abcdef}\\\"\",];var y = 10/2/1;return x[1][y];}//some={}random-padding+;";
let res = extract_js_fn(base_js, "Wka").unwrap(); let res = extract_js_fn(base_js, 0, "Wka").unwrap();
assert_eq!( assert_eq!(
res, res,
"var Wka = function(d){var x = [/,,/,913,/(,)}/,\"abcdef}\\\"\",];var y = 10/2/1;return x[1][y];};" "var Wka = function(d){var x = [/,,/,913,/(,)}/,\"abcdef}\\\"\",];var y = 10/2/1;return x[1][y];};"
@ -621,43 +545,33 @@ c[36](c[8],c[32]),c[20](c[25],c[10]),c[2](c[22],c[8]),c[32](c[20],c[16]),c[32](c
#[test] #[test]
fn t_extract_js_fn_outside_vars() { fn t_extract_js_fn_outside_vars() {
let base_js = "let a1 = 42;foo();var b1=11;var da=77;bar();Wka = function(da){var xy=1+2+a1*b1;return xy;}"; let base_js = "let a = 42;foo();var b=11;bar();Wka = function(d){var x=1+2+a*b;return x;}";
let res = extract_js_fn(base_js, "Wka").unwrap(); let res = extract_js_fn(base_js, 0, "Wka").unwrap();
// order of variables is non-reproducible // order of variables is non-reproducible
assert!( assert!(
res == "var a1 = 42; var b1=11; var Wka = function(da){var xy=1+2+a1*b1;return xy;};" res == "var a = 42; var b=11; var Wka = function(d){var x=1+2+a*b;return x;};"
|| res == "var b1=11; var a1 = 42; var Wka = function(da){var xy=1+2+a1*b1;return xy;};", || res == "var b=11; var a = 42; var Wka = function(d){var x=1+2+a*b;return x;};",
"got {res}" "got {res}"
); );
} }
#[test] #[test]
fn t_extract_js_fn_outside_vars2() { fn t_extract_js_fn_outside_vars2() {
let base_js = "{let a1 = {v1:1,v2:2}}foo();Wka = function(d){var x=1+2+a1.v1;return x;}"; let base_js = "{let a = {v1:1,v2:2}}foo();Wka = function(d){var x=1+2+a.v1;return x;}";
let res = extract_js_fn(base_js, "Wka").unwrap(); let res = extract_js_fn(base_js, 0, "Wka").unwrap();
assert_eq!( assert_eq!(
res, res,
"var a1 = {v1:1,v2:2}; var Wka = function(d){var x=1+2+a1.v1;return x;};" "var a = {v1:1,v2:2}; var Wka = function(d){var x=1+2+a.v1;return x;};"
); );
} }
#[test] #[test]
fn t_extract_js_fn_outside_vars3() { fn t_extract_js_fn_outside_vars3() {
let base_js = "Wka = function(d){var x=1+2+a1[0];return x;};let a1=[1,2,3]"; let base_js = "Wka = function(d){var x=1+2+a[0];return x;};let a=[1,2,3]";
let res = extract_js_fn(base_js, "Wka").unwrap(); let res = extract_js_fn(base_js, 0, "Wka").unwrap();
assert_eq!( assert_eq!(
res, res,
"var a1=[1,2,3]; var Wka = function(d){var x=1+2+a1[0];return x;};" "var a=[1,2,3]; var Wka = function(d){var x=1+2+a[0];return x;};"
);
}
#[test]
fn t_extract_js_fn_outside_vars4() {
let base_js = "let a0=123456;let a1=function(a){return a};let Wka = function(d){var x=1+2+a1();return x;}";
let res = extract_js_fn(base_js, "Wka").unwrap();
assert_eq!(
res,
"var a1=function(a){return a}; var Wka = function(d){var x=1+2+a1();return x;};"
); );
} }
@ -711,88 +625,65 @@ c[36](c[8],c[32]),c[20](c[25],c[10]),c[2](c[22],c[8]),c[32](c[20],c[16]),c[32](c
} }
// Test cases from https://github.com/yt-dlp/yt-dlp/blob/master/test/test_youtube_signature.py // Test cases from https://github.com/yt-dlp/yt-dlp/blob/master/test/test_youtube_signature.py
#[rstest]
#[case("6ed0d907", "AOq0QJ8wRAIgXmPlOPSBkkUs1bYFYlJCfe29xx8j7v1pDL2QwbdV96sCIEzpWqMGkFR20CFOg51Tp-7vj_EMu-m37KtXJoOySqa0")]
#[case("3bb1f723", "MyOSJXtKI3m-uME_jv7-pT12gOFC02RFkGoqWpzE0Cs69VdbwQ0LDp1v7j8xx92efCJlYFYb1sUkkBSPOlPmXgIARw8JQ0qOAOAA")]
#[case("2f1832d2", "0QJ8wRAIgXmPlOPSBkkUs1bYFYlJCfe29xxAj7v1pDL0QwbdV96sCIEzpWqMGkFR20CFOg51Tp-7vj_EMu-m37KtXJ2OySqa0q")]
#[tokio::test] #[tokio::test]
#[traced_test] #[traced_test]
async fn sig_tests() { async fn sig_tests(#[case] js_hash: &str, #[case] exp_sig: &str) {
let cases = [
("6ed0d907", "AOq0QJ8wRAIgXmPlOPSBkkUs1bYFYlJCfe29xx8j7v1pDL2QwbdV96sCIEzpWqMGkFR20CFOg51Tp-7vj_EMu-m37KtXJoOySqa0"),
("3bb1f723", "MyOSJXtKI3m-uME_jv7-pT12gOFC02RFkGoqWpzE0Cs69VdbwQ0LDp1v7j8xx92efCJlYFYb1sUkkBSPOlPmXgIARw8JQ0qOAOAA"),
("2f1832d2", "0QJ8wRAIgXmPlOPSBkkUs1bYFYlJCfe29xxAj7v1pDL0QwbdV96sCIEzpWqMGkFR20CFOg51Tp-7vj_EMu-m37KtXJ2OySqa0q"),
("643afba4", "AAOAOq0QJ8wRAIgXmPlOPSBkkUs1bYFYlJCfe29xx8j7vgpDL0QwbdV06sCIEzpWqMGkFR20CFOS21Tp-7vj_EMu-m37KtXJoOy1"),
("363db69b", "0aqSyOoJXtK73m-uME_jv7-pT15gOFC02RFkGMqWpz2ICs6EVdbwQ0LDp1v7j8xx92efCJlYFYb1sUkkBSPOlPmXgIARw8JQ0qOAOAA"),
("6450230e", "qax0aqSyOoJXtK73m-uME_jv7-pT152OFC02RFkGMqWpzEICs69VdbwQ0LDp1v7j8gx92efCJlYFYb1sUkkBSPOlPmXgIARw8JQ0qOAOAA"),
];
for (js_hash, exp_sig) in cases {
let span = tracing::span!(tracing::Level::ERROR, "sig_test", js_hash);
let _enter = span.enter();
let (js_url, js_path) = player_js_file(js_hash).await; let (js_url, js_path) = player_js_file(js_hash).await;
let player_js = std::fs::read_to_string(js_path).unwrap(); let player_js = std::fs::read_to_string(js_path).unwrap();
let deobf_data = DeobfData::extract_fns(&js_url, &player_js).unwrap(); let deobf_data = DeobfData::extract_fns(&js_url, &player_js).unwrap();
let deobf = Deobfuscator::new(&deobf_data).unwrap(); let deobf = Deobfuscator::new(&deobf_data).unwrap();
let deobf_sig = deobf.deobfuscate_sig("2aq0aqSyOoJXtK73m-uME_jv7-pT15gOFC02RFkGMqWpzEICs69VdbwQ0LDp1v7j8xx92efCJlYFYb1sUkkBSPOlPmXgIARw8JQ0qOAOAA").unwrap(); let deobf_sig = deobf.deobfuscate_sig("2aq0aqSyOoJXtK73m-uME_jv7-pT15gOFC02RFkGMqWpzEICs69VdbwQ0LDp1v7j8xx92efCJlYFYb1sUkkBSPOlPmXgIARw8JQ0qOAOAA").unwrap();
assert_eq!(deobf_sig, exp_sig, "[{js_hash}]"); assert_eq!(deobf_sig, exp_sig, "js: {js_hash}");
}
} }
#[rstest]
#[case("7862ca1f", "X_LCxVDjAavgE5t", "yxJ1dM6iz5ogUg")]
#[case("9216d1f7", "SLp9F5bwjAdhE9F-", "gWnb9IK2DJ8Q1w")]
#[case("f8cb7a3b", "oBo2h5euWy6osrUt", "ivXHpm7qJjJN")]
#[case("2dfe380c", "oBo2h5euWy6osrUt", "3DIBbn3qdQ")]
#[case("f1ca6900", "cu3wyu6LQn2hse", "jvxetvmlI9AN9Q")]
#[case("8040e515", "wvOFaY-yjgDuIEg5", "HkfBFDHmgw4rsw")]
#[case("e06dea74", "AiuodmaDDYw8d3y4bf", "ankd8eza2T6Qmw")]
#[case("5dd88d1d", "kSxKFLeqzv_ZyHSAt", "n8gS8oRlHOxPFA")]
#[case("324f67b9", "xdftNy7dh9QGnhW", "22qLGxrmX8F1rA")]
#[case("4c3f79c5", "TDCstCG66tEAO5pR9o", "dbxNtZ14c-yWyw")]
#[case("c81bbb4a", "gre3EcLurNY2vqp94", "Z9DfGxWP115WTg")]
#[case("1f7d5369", "batNX7sYqIJdkJ", "IhOkL_zxbkOZBw")]
#[case("009f1d77", "5dwFHw8aFWQUQtffRq", "audescmLUzI3jw")]
#[case("dc0c6770", "5EHDMgYLV6HPGk_Mu-kk", "n9lUJLHbxUI0GQ")]
#[case("113ca41c", "cgYl-tlYkhjT7A", "hI7BBr2zUgcmMg")]
#[case("c57c113c", "M92UUMHa8PdvPd3wyM", "3hPqLJsiNZx7yA")]
#[case("5a3b6271", "B2j7f_UPT4rfje85Lu_e", "m5DmNymaGQ5RdQ")]
#[case("7a062b77", "NRcE3y3mVtm_cV-W", "VbsCYUATvqlt5w")]
#[case("dac945fd", "o8BkRxXhuYsBCWi6RplPdP", "3Lx32v_hmzTm6A")]
#[case("6f20102c", "lE8DhoDmKqnmJJ", "pJTTX6XyJP2BYw")]
#[case("cfa9e7cb", "aCi3iElgd2kq0bxVbQ", "QX1y8jGb2IbZ0w")]
#[case("8c7583ff", "1wWCVpRR96eAmMI87L", "KSkWAVv1ZQxC3A")]
#[case("b7910ca8", "_hXMCwMt9qE310D", "LoZMgkkofRMCZQ")]
#[case("590f65a6", "1tm7-g_A9zsI8_Lay_", "xI4Vem4Put_rOg")]
#[case("b22ef6e7", "b6HcntHGkvBLk_FRf", "kNPW6A7FyP2l8A")]
#[case("3400486c", "lL46g3XifCKUZn1Xfw", "z767lhet6V2Skl")]
#[case("20dfca59", "-fLCxedkAk4LUTK2", "O8kfRq1y1eyHGw")]
#[case("b12cc44b", "keLa5R2U00sR9SQK", "N1OGyujjEwMnLw")]
#[case("3bb1f723", "gK15nzVyaXE9RsMP3z", "ZFFWFLPWx9DEgQ")]
#[case("2f1832d2", "YWt1qdbe8SAfkoPHW5d", "RrRjWQOJmBiP")]
#[case("19d2ae9d", "YWt1qdbe8SAfkoPHW5d", "CS6dVTYzpZrAZ5TD")]
#[tokio::test] #[tokio::test]
#[traced_test] #[traced_test]
async fn nsig_tests() { async fn nsig_tests(#[case] js_hash: &str, #[case] nsig_in: &str, #[case] expect: &str) {
let cases = [
("7862ca1f", "X_LCxVDjAavgE5t", "yxJ1dM6iz5ogUg"),
("9216d1f7", "SLp9F5bwjAdhE9F-", "gWnb9IK2DJ8Q1w"),
("f8cb7a3b", "oBo2h5euWy6osrUt", "ivXHpm7qJjJN"),
("2dfe380c", "oBo2h5euWy6osrUt", "3DIBbn3qdQ"),
("f1ca6900", "cu3wyu6LQn2hse", "jvxetvmlI9AN9Q"),
("8040e515", "wvOFaY-yjgDuIEg5", "HkfBFDHmgw4rsw"),
("e06dea74", "AiuodmaDDYw8d3y4bf", "ankd8eza2T6Qmw"),
("5dd88d1d", "kSxKFLeqzv_ZyHSAt", "n8gS8oRlHOxPFA"),
("324f67b9", "xdftNy7dh9QGnhW", "22qLGxrmX8F1rA"),
("4c3f79c5", "TDCstCG66tEAO5pR9o", "dbxNtZ14c-yWyw"),
("c81bbb4a", "gre3EcLurNY2vqp94", "Z9DfGxWP115WTg"),
("1f7d5369", "batNX7sYqIJdkJ", "IhOkL_zxbkOZBw"),
("009f1d77", "5dwFHw8aFWQUQtffRq", "audescmLUzI3jw"),
("dc0c6770", "5EHDMgYLV6HPGk_Mu-kk", "n9lUJLHbxUI0GQ"),
("113ca41c", "cgYl-tlYkhjT7A", "hI7BBr2zUgcmMg"),
("c57c113c", "M92UUMHa8PdvPd3wyM", "3hPqLJsiNZx7yA"),
("5a3b6271", "B2j7f_UPT4rfje85Lu_e", "m5DmNymaGQ5RdQ"),
("7a062b77", "NRcE3y3mVtm_cV-W", "VbsCYUATvqlt5w"),
("dac945fd", "o8BkRxXhuYsBCWi6RplPdP", "3Lx32v_hmzTm6A"),
("6f20102c", "lE8DhoDmKqnmJJ", "pJTTX6XyJP2BYw"),
("cfa9e7cb", "aCi3iElgd2kq0bxVbQ", "QX1y8jGb2IbZ0w"),
("8c7583ff", "1wWCVpRR96eAmMI87L", "KSkWAVv1ZQxC3A"),
("b7910ca8", "_hXMCwMt9qE310D", "LoZMgkkofRMCZQ"),
("590f65a6", "1tm7-g_A9zsI8_Lay_", "xI4Vem4Put_rOg"),
("b22ef6e7", "b6HcntHGkvBLk_FRf", "kNPW6A7FyP2l8A"),
("3400486c", "lL46g3XifCKUZn1Xfw", "z767lhet6V2Skl"),
("20dfca59", "-fLCxedkAk4LUTK2", "O8kfRq1y1eyHGw"),
("b12cc44b", "keLa5R2U00sR9SQK", "N1OGyujjEwMnLw"),
("3bb1f723", "gK15nzVyaXE9RsMP3z", "ZFFWFLPWx9DEgQ"),
("2f1832d2", "YWt1qdbe8SAfkoPHW5d", "RrRjWQOJmBiP"),
("19d2ae9d", "YWt1qdbe8SAfkoPHW5d", "CS6dVTYzpZrAZ5TD"),
("e7567ecf", "Sy4aDGc0VpYRR9ew_", "5UPOT1VhoZxNLQ"),
("d50f54ef", "Ha7507LzRmH3Utygtj", "XFTb2HoeOE5MHg"),
("074a8365", "Ha7507LzRmH3Utygtj", "ufTsrE0IVYrkl8v"),
("643afba4", "N5uAlLqm0eg1GyHO", "dCBQOejdq5s-ww"),
("69f581a5", "-qIP447rVlTTwaZjY", "KNcGOksBAvwqQg"),
("363db69b", "eWYu5d5YeY_4LyEDc", "XJQqf-N7Xra3gg"),
("6450230e", "eWYu5d5YeY_4LyEDc", "VfULHmlBUoDPVMN"),
];
for (js_hash, nsig_in, exp_nsig) in cases {
let span = tracing::span!(tracing::Level::ERROR, "nsig_test", js_hash);
let _enter = span.enter();
let (js_url, js_path) = player_js_file(js_hash).await; let (js_url, js_path) = player_js_file(js_hash).await;
let player_js = std::fs::read_to_string(js_path).unwrap(); let player_js = std::fs::read_to_string(js_path).unwrap();
let deobf_data = DeobfData::extract_fns(&js_url, &player_js).expect(js_hash); let deobf_data = DeobfData::extract_fns(&js_url, &player_js).unwrap();
let deobf = Deobfuscator::new(&deobf_data).expect(js_hash); let deobf = Deobfuscator::new(&deobf_data).unwrap();
let deobf_nsig = deobf.deobfuscate_nsig(nsig_in).expect(js_hash); let deobf_nsig = deobf.deobfuscate_nsig(nsig_in).unwrap();
assert_eq!(deobf_nsig, exp_nsig, "[{js_hash}]"); assert_eq!(deobf_nsig, expect, "js: {js_hash}");
}
} }
#[tokio::test] #[tokio::test]

View file

@ -105,13 +105,6 @@ pub enum UnavailabilityReason {
OfflineLivestream, OfflineLivestream,
/// YouTube banned your IP address from accessing the platform without an account /// YouTube banned your IP address from accessing the platform without an account
IpBan, IpBan,
/// YouTube bans IP addresses from certain VPN providers from accessing certain geo-restricted
/// videos.
///
/// If this happens to you, you can try another server / VPN provider or disable your VPN.
VpnBan,
/// YouTube requires the user to solve a ReCaptcha
Captcha,
/// Video temporarily unavailable (rate limit) /// Video temporarily unavailable (rate limit)
TryAgain, TryAgain,
/// Video cant be played for other reasons /// Video cant be played for other reasons
@ -132,8 +125,6 @@ impl Display for UnavailabilityReason {
UnavailabilityReason::MembersOnly => f.write_str("members-only"), UnavailabilityReason::MembersOnly => f.write_str("members-only"),
UnavailabilityReason::OfflineLivestream => f.write_str("offline stream"), UnavailabilityReason::OfflineLivestream => f.write_str("offline stream"),
UnavailabilityReason::IpBan => f.write_str("ip-ban"), UnavailabilityReason::IpBan => f.write_str("ip-ban"),
UnavailabilityReason::VpnBan => f.write_str("vpn-ban"),
UnavailabilityReason::Captcha => f.write_str("captcha"),
UnavailabilityReason::TryAgain => f.write_str("try again"), UnavailabilityReason::TryAgain => f.write_str("try again"),
UnavailabilityReason::Unplayable => f.write_str("unplayable"), UnavailabilityReason::Unplayable => f.write_str("unplayable"),
} }
@ -160,8 +151,6 @@ pub enum AuthError {
} }
pub(crate) mod internal { pub(crate) mod internal {
use std::borrow::Cow;
use super::{Error, ExtractionError}; use super::{Error, ExtractionError};
/// Error that occurred during the initialization /// Error that occurred during the initialization
@ -179,7 +168,7 @@ pub(crate) mod internal {
Extraction(&'static str), Extraction(&'static str),
/// Unspecified error /// Unspecified error
#[error("error: {0}")] #[error("error: {0}")]
Other(Cow<'static, str>), Other(&'static str),
} }
impl From<DeobfError> for Error { impl From<DeobfError> for Error {

View file

@ -38,7 +38,7 @@ pub struct Thumbnail {
pub enum UrlTarget { pub enum UrlTarget {
/// YouTube video /// YouTube video
/// ///
/// Example: <https://youtube.com/watch?v=ZeerrnuLi5E> /// Example: <youtube.com/watch?v=ZeerrnuLi5E>
Video { Video {
/// Unique YouTube video ID /// Unique YouTube video ID
id: String, id: String,
@ -1049,8 +1049,6 @@ pub struct TrackItem {
pub track_nr: Option<u16>, pub track_nr: Option<u16>,
/// Is the track by 'Various artists'? /// Is the track by 'Various artists'?
pub by_va: bool, pub by_va: bool,
/// Is the track unavailable on YouTube Music?
pub unavailable: bool,
} }
/// YouTube Music artist list item /// YouTube Music artist list item
@ -1236,8 +1234,6 @@ pub struct MusicAlbum {
pub year: Option<u16>, pub year: Option<u16>,
/// Is the album by 'Various artists'? /// Is the album by 'Various artists'?
pub by_va: bool, pub by_va: bool,
/// Number of album tracks
pub track_count: u16,
/// Album tracks /// Album tracks
pub tracks: Vec<TrackItem>, pub tracks: Vec<TrackItem>,
/// Album variants /// Album variants

View file

@ -70,8 +70,6 @@ pub struct RustyPipeInfo<'a> {
/// YouTube content language /// YouTube content language
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<Language>, pub language: Option<Language>,
/// RustyPipe Botguard version (`rustypipe-botguard 0.1.1`)
pub botguard_version: Option<&'a str>,
} }
/// Reported HTTP request data /// Reported HTTP request data
@ -106,14 +104,13 @@ pub enum Level {
ERR, ERR,
} }
impl<'a> RustyPipeInfo<'a> { impl RustyPipeInfo<'_> {
pub(crate) fn new(language: Option<Language>, botguard_version: Option<&'a str>) -> Self { pub(crate) fn new(language: Option<Language>) -> Self {
Self { Self {
package: env!("CARGO_PKG_NAME"), package: env!("CARGO_PKG_NAME"),
version: crate::VERSION, version: crate::VERSION,
date: util::now_sec(), date: util::now_sec(),
language, language,
botguard_version,
} }
} }
} }

View file

@ -53,8 +53,6 @@ pub(crate) struct Entry {
pub chan_prefix: &'static str, pub chan_prefix: &'static str,
/// Channel name suffix on playlist pages /// Channel name suffix on playlist pages
pub chan_suffix: &'static str, pub chan_suffix: &'static str,
/// "Other versions" title on album pages
pub album_versions_title: &'static str,
} }
#[rustfmt::skip] #[rustfmt::skip]
@ -185,7 +183,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "deur", chan_prefix: "deur",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Ander weergawes",
}, },
Language::Am => Entry { Language::Am => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -313,7 +310,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "", chan_suffix: "",
album_versions_title: "ሌሎች ስሪቶች",
}, },
Language::Ar => Entry { Language::Ar => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -449,7 +445,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "بواسطة", chan_prefix: "بواسطة",
chan_suffix: "", chan_suffix: "",
album_versions_title: "إصدارات أخرى",
}, },
Language::As => Entry { Language::As => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -572,7 +567,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "ৰ দ\u{9cd}\u{9be}\u{9be}", chan_suffix: "ৰ দ\u{9cd}\u{9be}\u{9be}",
album_versions_title: "অন\u{9cd}য সংস\u{9cd}কৰণ",
}, },
Language::Az => Entry { Language::Az => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -688,7 +682,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "by", chan_prefix: "by",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Digər versiyalar",
}, },
Language::Be => Entry { Language::Be => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -836,7 +829,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "ад", chan_prefix: "ад",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Іншыя версіі",
}, },
Language::Bg => Entry { Language::Bg => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -953,7 +945,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "от", chan_prefix: "от",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Други версии",
}, },
Language::Bn => Entry { Language::Bn => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -1071,7 +1062,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: ",", chan_prefix: ",",
chan_suffix: "\u{9cd}\u{9be}\u{9be}", chan_suffix: "\u{9cd}\u{9be}\u{9be}",
album_versions_title: "অন\u{9cd}য সংস\u{9cd}করণগ\u{9c1}লি",
}, },
Language::Bs => Entry { Language::Bs => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -1211,7 +1201,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "od", chan_prefix: "od",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Druge verzije",
}, },
Language::Ca => Entry { Language::Ca => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -1336,7 +1325,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "de:", chan_prefix: "de:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Altres versions",
}, },
Language::Cs => Entry { Language::Cs => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -1467,7 +1455,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "autor:", chan_prefix: "autor:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Jiné verze",
}, },
Language::Da => Entry { Language::Da => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -1592,7 +1579,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "af", chan_prefix: "af",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Andre versioner",
}, },
Language::De => Entry { Language::De => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -1714,7 +1700,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "von", chan_prefix: "von",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Weitere Versionen",
}, },
Language::El => Entry { Language::El => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -1845,7 +1830,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "από το χρήστη", chan_prefix: "από το χρήστη",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Άλλες εκτελέσεις",
}, },
Language::En | Language::EnGb | Language::EnIn => Entry { Language::En | Language::EnGb | Language::EnIn => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -1987,7 +1971,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "by", chan_prefix: "by",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Other versions",
}, },
Language::Es => Entry { Language::Es => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -2115,7 +2098,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "de", chan_prefix: "de",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Otras versiones",
}, },
Language::EsUs | Language::Es419 => Entry { Language::EsUs | Language::Es419 => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -2244,7 +2226,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "de", chan_prefix: "de",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Otras versiones",
}, },
Language::Et => Entry { Language::Et => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -2370,7 +2351,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "kanalilt", chan_prefix: "kanalilt",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Teised versioonid",
}, },
Language::Eu => Entry { Language::Eu => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -2487,7 +2467,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "egilea:", chan_prefix: "egilea:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Beste bertsio batzuk",
}, },
Language::Fa => Entry { Language::Fa => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -2595,7 +2574,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "توسط", chan_prefix: "توسط",
chan_suffix: "", chan_suffix: "",
album_versions_title: "نسخه\u{200c}های دیگر",
}, },
Language::Fi => Entry { Language::Fi => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -2715,7 +2693,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "tekijä:", chan_prefix: "tekijä:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Muut versiot",
}, },
Language::Fil => Entry { Language::Fil => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -2833,7 +2810,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "ni/ng", chan_prefix: "ni/ng",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Iba pang bersyon",
}, },
Language::Fr | Language::FrCa => Entry { Language::Fr | Language::FrCa => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -2965,7 +2941,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "de", chan_prefix: "de",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Autres versions",
}, },
Language::Gl => Entry { Language::Gl => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -3090,7 +3065,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "de", chan_prefix: "de",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Outras versións",
}, },
Language::Gu => Entry { Language::Gu => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -3196,7 +3170,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{acd}વારા", chan_suffix: "\u{acd}વારા",
album_versions_title: "અન\u{acd}ય વર\u{acd}ઝન",
}, },
Language::Hi => Entry { Language::Hi => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -3313,7 +3286,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{947}\u{93c}रिए", chan_suffix: "\u{947}\u{93c}रिए",
album_versions_title: "अन\u{94d}य वर\u{94d}शन",
}, },
Language::Hr => Entry { Language::Hr => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -3453,7 +3425,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "omogućio kanal", chan_prefix: "omogućio kanal",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Druge verzije",
}, },
Language::Hu => Entry { Language::Hu => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -3583,7 +3554,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "csatornától", chan_suffix: "csatornától",
album_versions_title: "Más verziók",
}, },
Language::Hy => Entry { Language::Hy => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -3706,7 +3676,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "հեղինակ՝", chan_prefix: "հեղինակ՝",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Այլ տարբերակներ",
}, },
Language::Id => Entry { Language::Id => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -3825,7 +3794,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "oleh", chan_prefix: "oleh",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Versi lainnya",
}, },
Language::Is => Entry { Language::Is => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -3960,7 +3928,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "eftir", chan_prefix: "eftir",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Aðrar útgáfur",
}, },
Language::It => Entry { Language::It => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4093,7 +4060,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "di", chan_prefix: "di",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Altre versioni",
}, },
Language::Iw => Entry { Language::Iw => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4232,7 +4198,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "מאת", chan_prefix: "מאת",
chan_suffix: "", chan_suffix: "",
album_versions_title: "גרסאות אחרות",
}, },
Language::Ja => Entry { Language::Ja => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4313,7 +4278,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "作成者:", chan_prefix: "作成者:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "他のバージョン",
}, },
Language::Ka => Entry { Language::Ka => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4436,7 +4400,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "-ის მიერ", chan_suffix: "-ის მიერ",
album_versions_title: "სხვა ვერსიები",
}, },
Language::Kk => Entry { Language::Kk => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4560,7 +4523,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "қосқан", chan_prefix: "қосқан",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Басқа нұсқалары",
}, },
Language::Km => Entry { Language::Km => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4661,7 +4623,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "ដោយ", chan_prefix: "ដោយ",
chan_suffix: "", chan_suffix: "",
album_versions_title: "\u{17d2}រភេទផ\u{17d2}សេងៗ",
}, },
Language::Kn => Entry { Language::Kn => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4788,7 +4749,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "ಚಾನಲ\u{ccd}\u{200c}\u{cbf}ಂದ", chan_suffix: "ಚಾನಲ\u{ccd}\u{200c}\u{cbf}ಂದ",
album_versions_title: "ಇತರ ಆವೃತ\u{ccd}\u{cbf}ಗಳು",
}, },
Language::Ko => Entry { Language::Ko => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4872,7 +4832,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "게시자:", chan_prefix: "게시자:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "다른 버전",
}, },
Language::Ky => Entry { Language::Ky => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -4991,7 +4950,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "каналы аркылуу", chan_suffix: "каналы аркылуу",
album_versions_title: "Башка версиялар",
}, },
Language::Lo => Entry { Language::Lo => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -5118,7 +5076,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "ໂດຍ", chan_prefix: "ໂດຍ",
chan_suffix: "", chan_suffix: "",
album_versions_title: "ເວ\u{eb5}\u{eb1}ນອ\u{eb7}\u{ec8}ນໆ",
}, },
Language::Lt => Entry { Language::Lt => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -5253,7 +5210,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "pridėjo", chan_prefix: "pridėjo",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Kitos versijos",
}, },
Language::Lv => Entry { Language::Lv => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -5388,7 +5344,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "autors:", chan_prefix: "autors:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Citas versijas",
}, },
Language::Mk => Entry { Language::Mk => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -5516,7 +5471,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "од", chan_prefix: "од",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Други верзии",
}, },
Language::Ml => Entry { Language::Ml => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -5631,7 +5585,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{d41}ഖേന", chan_suffix: "\u{d41}ഖേന",
album_versions_title: "മറ\u{d4d}\u{d4d} പതിപ\u{d4d}\u{d41}കൾ",
}, },
Language::Mn => Entry { Language::Mn => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -5736,7 +5689,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "сувгийн нэр:", chan_prefix: "сувгийн нэр:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Бусад хувилбар",
}, },
Language::Mr => Entry { Language::Mr => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -5861,7 +5813,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{94d}वार\u{947}", chan_suffix: "\u{94d}वार\u{947}",
album_versions_title: "इतर आव\u{943}\u{94d}\u{94d}या",
}, },
Language::Ms => Entry { Language::Ms => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -5975,7 +5926,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "oleh", chan_prefix: "oleh",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Versi lain",
}, },
Language::My => Entry { Language::My => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -6096,7 +6046,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{103e}", chan_suffix: "\u{103e}",
album_versions_title: "အခြား ဗားရ\u{103e}\u{103a}းများ",
}, },
Language::Ne => Entry { Language::Ne => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -6200,7 +6149,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{94d}वारा", chan_suffix: "\u{94d}वारा",
album_versions_title: "अन\u{94d}य स\u{902}\u{94d}करणहर\u{942}",
}, },
Language::Nl => Entry { Language::Nl => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -6323,7 +6271,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "door", chan_prefix: "door",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Andere versies",
}, },
Language::No => Entry { Language::No => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -6452,7 +6399,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "av", chan_prefix: "av",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Andre versjoner",
}, },
Language::Or => Entry { Language::Or => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -6568,7 +6514,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{b4d}\u{b3e}\u{b3e}", chan_suffix: "\u{b4d}\u{b3e}\u{b3e}",
album_versions_title: "ଅନ\u{b4d}ୟ ସଂସ\u{b4d}କରଣଗ\u{b41}\u{b3c}\u{b3f}",
}, },
Language::Pa => Entry { Language::Pa => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -6684,7 +6629,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{a71}\u{a4b}\u{a02}", chan_suffix: "\u{a71}\u{a4b}\u{a02}",
album_versions_title: "\u{a4b}ਰ ਵਰਜਨ",
}, },
Language::Pl => Entry { Language::Pl => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -6830,7 +6774,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "autor:", chan_prefix: "autor:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Inne wersje",
}, },
Language::Pt => Entry { Language::Pt => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -6960,7 +6903,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "por", chan_prefix: "por",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Outras versões",
}, },
Language::PtPt => Entry { Language::PtPt => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -7073,7 +7015,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "de", chan_prefix: "de",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Outras versões",
}, },
Language::Ro => Entry { Language::Ro => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -7202,7 +7143,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "de", chan_prefix: "de",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Alte versiuni",
}, },
Language::Ru => Entry { Language::Ru => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -7346,7 +7286,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Другие версии",
}, },
Language::Si => Entry { Language::Si => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -7458,7 +7397,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{dd2}\u{dd2}\u{dca}", chan_suffix: "\u{dd2}\u{dd2}\u{dca}",
album_versions_title: "අනෙක\u{dd4}\u{dca} අන\u{dd4}\u{dcf}දයන\u{dca}",
}, },
Language::Sk => Entry { Language::Sk => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -7589,7 +7527,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "Autori:", chan_prefix: "Autori:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Ďalšie verzie",
}, },
Language::Sl => Entry { Language::Sl => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -7739,7 +7676,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "kanal", chan_prefix: "kanal",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Druge različice",
}, },
Language::Sq => Entry { Language::Sq => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -7860,7 +7796,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "nga", chan_prefix: "nga",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Versione të tjera",
}, },
Language::Sr => Entry { Language::Sr => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -7991,7 +7926,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "са канала", chan_prefix: "са канала",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Друге верзије",
}, },
Language::SrLatn => Entry { Language::SrLatn => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -8122,7 +8056,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "sa kanala", chan_prefix: "sa kanala",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Druge verzije",
}, },
Language::Sv => Entry { Language::Sv => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -8245,7 +8178,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "från", chan_prefix: "från",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Andra versioner",
}, },
Language::Sw => Entry { Language::Sw => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -8359,7 +8291,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "kutoka", chan_prefix: "kutoka",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Matoleo mengine",
}, },
Language::Ta => Entry { Language::Ta => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -8490,7 +8421,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "வழங\u{bcd}கியவர\u{bcd}:", chan_prefix: "வழங\u{bcd}கியவர\u{bcd}:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "பிற பதிப\u{bcd}புகள\u{bcd}",
}, },
Language::Te => Entry { Language::Te => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -8617,7 +8547,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "\u{c3e}\u{c46}\u{c4d}\u{c4d}\u{c3e}\u{c3e}", chan_suffix: "\u{c3e}\u{c46}\u{c4d}\u{c4d}\u{c3e}\u{c3e}",
album_versions_title: "ఇతర వ\u{c46}\u{c4d}షన\u{c4d}\u{200c}లు",
}, },
Language::Th => Entry { Language::Th => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -8748,7 +8677,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "โดย", chan_prefix: "โดย",
chan_suffix: "", chan_suffix: "",
album_versions_title: "เวอร\u{e4c}\u{e31}นอ\u{e37}\u{e48}นๆ",
}, },
Language::Tr => Entry { Language::Tr => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -8869,7 +8797,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "tarafından", chan_suffix: "tarafından",
album_versions_title: "Diğer versiyonlar",
}, },
Language::Uk => Entry { Language::Uk => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -9018,7 +8945,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "власник:", chan_prefix: "власник:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Інші версії",
}, },
Language::Ur => Entry { Language::Ur => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -9144,7 +9070,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "منجانب", chan_prefix: "منجانب",
chan_suffix: "", chan_suffix: "",
album_versions_title: "دیگر ورژنز",
}, },
Language::Uz => Entry { Language::Uz => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -9259,7 +9184,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "muallif:", chan_prefix: "muallif:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Boshqa versiyalari",
}, },
Language::Vi => Entry { Language::Vi => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -9341,7 +9265,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "của", chan_prefix: "của",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Các phiên bản khác",
}, },
Language::ZhCn => Entry { Language::ZhCn => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -9439,7 +9362,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "创建者:", chan_prefix: "创建者:",
chan_suffix: "", chan_suffix: "",
album_versions_title: "其他版本",
}, },
Language::ZhHk => Entry { Language::ZhHk => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -9521,7 +9443,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "來自", chan_prefix: "來自",
chan_suffix: "", chan_suffix: "",
album_versions_title: "其他版本",
}, },
Language::ZhTw => Entry { Language::ZhTw => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -9602,7 +9523,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "", chan_prefix: "",
chan_suffix: "建立", chan_suffix: "建立",
album_versions_title: "其他版本",
}, },
Language::Zu => Entry { Language::Zu => Entry {
timeago_tokens: ::phf::Map { timeago_tokens: ::phf::Map {
@ -9738,7 +9658,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}, },
chan_prefix: "ka-", chan_prefix: "ka-",
chan_suffix: "", chan_suffix: "",
album_versions_title: "Ezinye izinguqulo",
}, },
} }
} }

View file

@ -21,7 +21,7 @@ use regex::Regex;
use url::Url; use url::Url;
use crate::{ use crate::{
error::Error, error::{AuthError, Error, ExtractionError},
param::{Country, Language, COUNTRIES}, param::{Country, Language, COUNTRIES},
serializer::text::TextComponent, serializer::text::TextComponent,
}; };
@ -75,10 +75,10 @@ pub fn get_cg_from_fancy_regexes(regexes: &[&str], text: &str, cg_name: &str) ->
/// Generate a random string with given length and byte charset. /// Generate a random string with given length and byte charset.
fn random_string(charset: &[u8], length: usize) -> String { fn random_string(charset: &[u8], length: usize) -> String {
let mut result = String::with_capacity(length); let mut result = String::with_capacity(length);
let mut rng = rand::rng(); let mut rng = rand::thread_rng();
for _ in 0..length { for _ in 0..length {
result.push(char::from(charset[rng.random_range(0..charset.len())])); result.push(char::from(charset[rng.gen_range(0..charset.len())]));
} }
result result
@ -90,14 +90,14 @@ pub fn generate_content_playback_nonce() -> String {
} }
pub fn random_uuid() -> String { pub fn random_uuid() -> String {
let mut rng = rand::rng(); let mut rng = rand::thread_rng();
format!( format!(
"{:08x}-{:04x}-{:04x}-{:04x}-{:012x}", "{:08x}-{:04x}-{:04x}-{:04x}-{:012x}",
rng.random::<u32>(), rng.gen::<u32>(),
rng.random::<u16>(), rng.gen::<u16>(),
rng.random::<u16>(), rng.gen::<u16>(),
rng.random::<u16>(), rng.gen::<u16>(),
rng.random::<u64>() & 0xffff_ffff_ffff, rng.gen::<u64>() & 0xffff_ffff_ffff,
) )
} }
@ -229,7 +229,7 @@ pub fn retry_delay(
backoff_base: u32, backoff_base: u32,
) -> u32 { ) -> u32 {
let unjittered_delay = backoff_base.checked_pow(n_past_retries).unwrap_or(u32::MAX); let unjittered_delay = backoff_base.checked_pow(n_past_retries).unwrap_or(u32::MAX);
let jitter_factor = rand::rng().random_range(800..1500); let jitter_factor = rand::thread_rng().gen_range(800..1500);
let jittered_delay = unjittered_delay let jittered_delay = unjittered_delay
.checked_mul(jitter_factor) .checked_mul(jitter_factor)
.unwrap_or(u32::MAX); .unwrap_or(u32::MAX);
@ -581,10 +581,9 @@ where
/// ///
/// If no user is logged in, YouTube returns a "NotFound" error. This has to be corrected /// If no user is logged in, YouTube returns a "NotFound" error. This has to be corrected
/// into a NoLogin error. /// into a NoLogin error.
#[cfg(feature = "userdata")]
pub fn map_internal_playlist_err(e: Error) -> Error { pub fn map_internal_playlist_err(e: Error) -> Error {
if let Error::Extraction(crate::error::ExtractionError::NotFound { .. }) = e { if let Error::Extraction(ExtractionError::NotFound { .. }) = e {
Error::Auth(crate::error::AuthError::NoLogin) Error::Auth(AuthError::NoLogin)
} else { } else {
e e
} }

Some files were not shown because too many files have changed in this diff Show more