Compare commits
	
		
			8 commits
		
	
	
		
			
				main
			
			...
			
				feat/timez
			
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 052eaf7e69 | |||
| 73bd9b34b1 | |||
| 137f6bac83 | |||
| 93eb3b4f04 | |||
| f80a1bf054 | |||
| e4e93ad0bd | |||
| 2528968131 | |||
| e97df3e615 | 
					 130 changed files with 788 additions and 49243 deletions
				
			
		|  | @ -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" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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/* |  | ||||||
|  | @ -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
									
								
							
							
						
						
									
										10
									
								
								.woodpecker.yml
									
										
									
									
									
										Normal 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 | ||||||
							
								
								
									
										98
									
								
								CHANGELOG.md
									
										
									
									
									
								
							
							
						
						
									
										98
									
								
								CHANGELOG.md
									
										
									
									
									
								
							|  | @ -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 | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								Cargo.toml
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								Cargo.toml
									
										
									
									
									
								
							|  | @ -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"] | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								Justfile
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								Justfile
									
										
									
									
									
								
							|  | @ -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 ---" | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								README.md
									
										
									
									
									
								
							|  | @ -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
									
								
							
							
						
						
									
										
											BIN
										
									
								
								bg_snapshot.bin
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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" |  | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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\"")) |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -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, |  | ||||||
| } |  | ||||||
|  | @ -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()); | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -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"; | ||||||
|  |  | ||||||
|  | @ -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 } => { | ||||||
|  |  | ||||||
|  | @ -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.
 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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%) |  | ||||||
| 
 |  | ||||||
|  |  | ||||||
| 
 |  | ||||||
| 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 | 
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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()), | ||||||
|  |  | ||||||
|  | @ -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 = | ||||||
|  | @ -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::*; | ||||||
|  |  | ||||||
|  | @ -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(), | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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 = | ||||||
|  | @ -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(); | ||||||
|  |  | ||||||
|  | @ -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() | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
|  |  | ||||||
|  | @ -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( | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
|  |  | ||||||
|  | @ -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 { | ||||||
|  | @ -647,36 +608,31 @@ pub(crate) struct PhMetadataRow { | ||||||
| 
 | 
 | ||||||
| #[serde_as] | #[serde_as] | ||||||
| #[derive(Debug, Deserialize)] | #[derive(Debug, Deserialize)] | ||||||
| #[serde(untagged)] | #[serde(rename_all = "camelCase")] | ||||||
| pub(crate) enum MetadataPart { | pub(crate) enum MetadataPart { | ||||||
|     Text { |     Text(#[serde_as(as = "AttributedText")] TextComponent), | ||||||
|         #[serde_as(as = "AttributedText")] |     #[serde(rename_all = "camelCase")] | ||||||
|         text: TextComponent, |     AvatarStack { | ||||||
|  |         avatar_stack_view_model: TextComponentBox, | ||||||
|     }, |     }, | ||||||
|     #[serde(rename_all = "camelCase")] |  | ||||||
|     AvatarStack { avatar_stack: AvatarStackInner }, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[derive(Debug, Deserialize)] |  | ||||||
| #[serde(rename_all = "camelCase")] |  | ||||||
| pub(crate) struct AvatarStackInner { |  | ||||||
|     pub 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(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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)] | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -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")] | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  | @ -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", | ||||||
|  |  | ||||||
|  | @ -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", | ||||||
|  |  | ||||||
|  | @ -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: [ | ||||||
|  |  | ||||||
|  | @ -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: [ | ||||||
|  |  | ||||||
|  | @ -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: [ | ||||||
|  |  | ||||||
|  | @ -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: [ | ||||||
|  |  | ||||||
|  | @ -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: [ | ||||||
|  |  | ||||||
|  | @ -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: [ | ||||||
|  |  | ||||||
|  | @ -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: [], | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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: [ | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  | @ -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, |  | ||||||
|   ), |   ), | ||||||
| ] | ] | ||||||
|  |  | ||||||
|  | @ -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, |  | ||||||
|   ), |   ), | ||||||
| ] | ] | ||||||
|  |  | ||||||
|  | @ -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: [], | ||||||
|  |  | ||||||
|  | @ -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: [], |  | ||||||
| ) |  | ||||||
|  | @ -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: [], | ||||||
|  |  | ||||||
|  | @ -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: [ | ||||||
|  |  | ||||||
|  | @ -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: [], | ||||||
|  |  | ||||||
|  | @ -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: [], | ||||||
|  |  | ||||||
|  | @ -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: [], | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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", | ||||||
|  |  | ||||||
|  | @ -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", | ||||||
|  |  | ||||||
|  | @ -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", | ||||||
|  |  | ||||||
|  | @ -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", | ||||||
|  |  | ||||||
|  | @ -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", | ||||||
|  |  | ||||||
|  | @ -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, |  | ||||||
|     )), |     )), | ||||||
|   ], |   ], | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
|  | @ -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"), | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -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, | ||||||
|  |  | ||||||
|  | @ -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] | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								src/error.rs
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								src/error.rs
									
										
									
									
									
								
							|  | @ -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 { | ||||||
|  |  | ||||||
|  | @ -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
 | ||||||
|  |  | ||||||
|  | @ -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, |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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", |  | ||||||
|         }, |         }, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue